(中職)計算機程序設(shè)計(C語言)第九章第2節(jié)教學(xué)課件工信版
單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,YCF,(中職)計算機程序設(shè)計(C語言)第九章第2節(jié)教學(xué)課件工信版,第九章 指針與結(jié)構(gòu)體,9.2指針變量的應(yīng)用,9.2指針變量的應(yīng)用,9.2.1指針與數(shù)組,9.2.2指針與字符串,9.2.3指針與函數(shù),9.2.1指針與數(shù)組,1、一維數(shù)組元素及數(shù)組元素的地址,假設(shè)有一5個元素的a數(shù)組,則元素和地址分別可以表示如圖9-2-1,2、用指針變量引用數(shù)組元素,如:,int *p ,x10=0,1,2,3,4,5,6,7,8,9;,p=a;,這里的指針變量p的值是x數(shù)組的首地址,即為&x0,p的值每增加1則自動跳轉(zhuǎn)到下一個數(shù)組元素的地址。,因此,x數(shù)組的第i個元素可表示為:ai、*(a+i)、*(p+i),其中*(p+i)為指針表示法;x數(shù)組的第i個元素的地址可表示為:&ai 、a+i、p+i,其中p+i為指針表示法。,3、指針變量在數(shù)組中的應(yīng)用,【例9.9】將數(shù)組x中全部元素變成原來的2倍,再輸出x數(shù)組。,(1) # include ,(2) void main( ),(3) ,(4) int x =1,2,3,4,5;,(5) int *p,i;,(6) for (p=x;p<x+5;p+),(7) printf("%5d",*p);,(8) printf(“n”);,(9) for (i=0;i<5;i+),(10) xi=xi*2;,(11) p=x;,(12) for (i=0;i<5;i+),(13) printf("%5d",*(p+i);,(14) printf("n");,(15) ,程序運行結(jié)果:,1 2 3 4 5,2 4 6 8 10,注意:,(1)程序第6行中的p+不能用x+替換,因為數(shù)組名x代表數(shù)組的起始地址,它是對于一個已經(jīng)定義的數(shù)組是不能改變的,即為一個地址常量,而指針變量p是一個指針變量;,(2)程序第11行,不能省略,必須要把指針變量p的值重新拉回到數(shù)組x的首地址;,(3)程序第13行,在使用指針變量時要注意地址的值不能超出數(shù)組元素的界限。,9.2.2指針與字符串,1、指向字符串的指針變量的定義,如:,char *p ="student",這里的賦值只是把字符串的首地址賦給p,而不是把字符串賦給p,p是一個指針變量,它不能存放一個字符串,只能存放一個地址。,2、利用指針變量輸出字符串,如:,char *p ="student",printf("%sn",p);,輸出字符串時,從指針變量p所記錄的首地址開始依次向后輸出直到碰到字符口串結(jié)束符´0´為止。,因此,也可以用循環(huán)來實現(xiàn)字符串中字符的逐個輸出,如:,char *p = "student",for (;*p!= ´0´p+),printf("%c",*p);,3、字符數(shù)組與字符指針變量的區(qū)別,如:,char s = "I am a student. ",char *p= "I am a student. ",(1)系統(tǒng)分配空間不同:定義數(shù)組s時,系統(tǒng)會給s分配一片連續(xù)的存儲單元,而定義指針變量p時,系統(tǒng)只給p分配一個存儲單元。,(2)存儲方式不同:數(shù)組s中存放的是字符串中的字符和0,而指針變量p中存放的是字符串的首地址。,(3)賦值方式不同:,數(shù)組可以進(jìn)行初始化,但不能使用賦值語句;,如:,char str110,str2 = "great“;,4、字符串指針的應(yīng)用,【例9.10】利用字符串指針實現(xiàn)兩個字符串的復(fù)制。,# include ,void main ( ),char *a= "tiger",*b= "dog",char *x=a,*y=b;,puts(a);,puts(b);,while (*y!= ´0´),*x=*y;,x+;,y+;,*x=´0´,puts(a);,puts(b);,分析如圖9-2-2,x,x+,x+,x+,y,y+,y+,y+,0,g,o,d,t,i,g,e,r,0,a,b,圖9-2-2,9.2.3指針與函數(shù),1、指針變量作函數(shù)的參數(shù),【例9.11】編程實現(xiàn)兩個整型變量值的交換(要求用函數(shù)swap( )實現(xiàn)兩數(shù)值的交換)。,# include ,void swap(int *a,int *b),int t;,t=*a;,*a=*b;,*b=t;,void main( ),int x,y ;,int *p1,*p2;,p1=,p2=,x=5;,y=10;,swap(p1,p2);,printf("x=%dty=%dn",x,y);,程序中在調(diào)用swap( )函數(shù)時將變量x和y的地址分別傳遞給了指針變量a和b,形參和實參之間的傳遞關(guān)系為“地址傳遞”,即實參隨著形參的改變而改變。,程序運行結(jié)果:,x=10 y=5,實現(xiàn)了x和y值的交換功能。,2、指針變量作函數(shù)的返回量,我們在前面用到的函數(shù)中的返回值的數(shù)據(jù)類型主要有int ,float ,char ,double等,還可以無返回值即返回值類型為void,函數(shù)的返回值其實也可以是一個指針類型的數(shù)據(jù)(即地址)。,若函數(shù)的返回值是一個指針類型的數(shù)據(jù),則函數(shù)的定義格式如下:,數(shù)據(jù)類型 *函數(shù)名(形參表列),函數(shù)體;,如:,int *fun(int x, int y),【例9.12】在一個字符型數(shù)組中存放兩個字符串,分別用兩個指針變量記錄它們的首地址(每個字符串的首地址的值由一個指針函數(shù)返回),分別輸出字符型數(shù)組和兩個字符串的首地址的值及兩個字符串和字符型數(shù)組中已被賦好的字符。,# include ,# include ,# define SIZE 100,char bufSIZE;,char *p=buf;,char *alloc(int n),char *begin;,if (p+n<=buf+ SIZE),begin=p;,p=p+n;,return(begin);,else,return(NULL);,void main ( ),p2= buf+10pp1=bufbuf1buf0buf99buf15buf14buf13buf10buf9buf8210da09圖9-2-3,char *p1,*p2;,int i;,p1=alloc(10);,strcpy(p1, "123456789");,p2=alloc(5);,strcpy(p2, "abcd");,printf("buf=%pn",buf);,printf("p1=%pn",p1);,printf("p2=%pn",p2);,puts(p1);,puts(p2);,for (i=0;i<15;i+),printf("%c",bufi);,分析如圖9-2-3所示,說明:(1)格式字符串%p輸出變量的內(nèi)存地址。,(2)buf數(shù)組的輸出在這里不能用%s,若用%s,只能輸出p1所指的字符串。,用for (i=0;i<15;i+) printf("%c",bufi);,可將兩個字符串都輸出。,程序運行結(jié)果:,buf=00427E64,p1=00427E64,p2=00427E6E,123456789,abcd,123456789 abcd,p2= buf+10,p,p1=buf,buf1,buf0,buf99,buf15,buf14,buf13,buf10,buf9,buf8,2,1,0,d,a,0,9,圖9-2-3,