2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、,第9章 指針,,1,,,,,,,,2,引例,● A.B.C三人欲借用某旅館的一個(gè)房間,A先到達(dá),在旅館的服務(wù)臺(tái)登記房間,房號(hào)是5818,然后A打電話通知了B,但是沒有通知C,問B和C怎么找到A?B可以直接到5818房間找到AC到旅館服務(wù)臺(tái)查詢A的房號(hào)為5818,然后再找到A,3,§9.1 地址和指針的概念,●一、變量的地址 計(jì)算機(jī)中,數(shù)據(jù)存儲(chǔ)在內(nèi)存中. 內(nèi)存可以劃分為若干個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元可以

2、存放8位bit二進(jìn)制數(shù),即1個(gè)字節(jié)byte. 內(nèi)存當(dāng)中采用線性地址編碼,每個(gè)單元具有唯一一個(gè)地址編碼.,1、變量的地址: 系統(tǒng)為變量單元分配的內(nèi)存地址 —— 一個(gè)無符號(hào)整數(shù),int a;float b;a=3;b=5;,,,a,3AB0,,,b,3AC0,,2、變量的屬性 存儲(chǔ)內(nèi)容: 數(shù)據(jù)值 空間大小: 數(shù)據(jù)類型 空間位置: 地址 生存周期: 存儲(chǔ)類別,3,5,4,

3、67;9.1地址和指針的概念,二、變量的訪問方式1、直接訪問,2、間接訪問: 定義一個(gè)變量p,存放a的地址,通過p來訪問a,int afloat ba=3;b=5;,若將p中地址換成3AC0(B的地址),則可以通過p來訪問B,5,§9.1地址和指針的概念,三、指針變量 指針變量是存放地址的變量;,如何定義p?如何獲得變量a的地址,即p中的內(nèi)容?如何通過p來訪問a?,如:p為指針變量,它存放整型

4、變量a的首地址, 則稱指針變量p指向整型變量a。,,,,6,§9.2 指針變量的定義與引用,●一、定義方法 類型符 *指針變量名,指針變量的類型:指針?biāo)赶騼?nèi)存單元中存放的數(shù)據(jù)的類型.,int *p1,*p2;char *ps;float *pf1,*pf2;,(1)用變量地址給指針變量賦值(使用到地址符&),●二、指針變量的賦值 指針變量的值為地址,是個(gè)無符號(hào)整數(shù).

5、 不能直接將一個(gè)整數(shù)常量賦值給指針變量,int *p1p1=0X1234,int *p,a ,b;p=&a;,注:變量的類型必須與指針變量類型相同,(2)用相同類型的指針變量賦值,int *p1, *p2, a;p1=&a;p2=p1;,注:若不賦值,則指針變量的值是隨機(jī)的.,(3)賦空值NULL,int *p1;p1=NULL;或p1=0;,int *

6、p1=NULL;float a;float *p2=&a;char ch, *p3=&ch;,7,§9.2 指針變量的定義與引用,●三、指針變量的應(yīng)用1.兩個(gè)有關(guān)的運(yùn)算符: * , &,形式: &任意變量 /*取變量地址運(yùn)算符*/ *指針變量 /*指針運(yùn)算符*/,含義: &a表示變量a所占據(jù)的內(nèi)存空間的首地址; *p表示指針變

7、量p所指向的內(nèi)存單元中的數(shù)據(jù). 如果:p=&a; *p?a,①將指針變量指向被訪問的變量 如: int a=5, *p, b; p=&a;,應(yīng)用: 通過指針變量指向所指的變量,即通過p訪問a;(步驟),②訪問所指變量 取內(nèi)容: b=*p; printf(“%d\n”,b);,③存內(nèi)容: *p=100;,例9-1void main(){

8、 int a=5, b=3; int *p; p=&a; b=*p+5; printf(“%d\n”,b); *p=4; printf(“%d,%d\n”, a,*p);},注意:*p若出現(xiàn)在“=”右邊或其他表達(dá)式中則為取內(nèi)容;*p若出現(xiàn)在“=”左邊則存內(nèi)容,即向內(nèi)存中寫數(shù)據(jù).,8,§9.2 指針變量的定義與引用,●三、指針變量的應(yīng)用2.運(yùn)算規(guī)則,&,*

9、優(yōu)先級(jí)相同,且為右結(jié)合,※與++.--.!等單目運(yùn)算符優(yōu)先級(jí)相同※高于算術(shù)運(yùn)算符*, /, %,①printf():從右到左輸出,②(*q)++ 和 *(q++)兩者不同 內(nèi)容++ 地址++,例9-1void main(){ int a=2, *p=&a, *q=&a; printf(“%d,%d\n”,*p++, *(q++)); p=&a, q=&a;

10、printf(“%d,%d\n”, *p,(*q)++);},若有:int a=5, *p=&a;寫出下面表達(dá)式的結(jié)果,并找出等價(jià)的表達(dá)式&*p *&a (*p)++ &a a *p++ *(p++) a++,思考:下列表達(dá)式是什么意思? &*p *&a,牢記下列等價(jià)式:int

11、*p=&a;&*p?p *&a?a &a?p *p?a,結(jié)果: 2 2 3 2,要求:* 后一定是指針變量;,9,例9-2#include void main(){ int a, b, c; int *pa, *pb, *pc; pa=&a; pb=&b; pc=&am

12、p;c; scanf(“%d%d”, pa, pb); printf(“a=%d, b=%d\n”, *pa, *pb); c=a+b; printf(“c=%d\n”, *pc); *pc=a+*pb; printf(“c=%d\n”, c); c=*pa * *pb;

13、 printf(“c=%d\n”, c); c=++*pa + (*pb)++; printf(“c=%d\n”, c); c=(*pa)++ + *pb; printf(“c=%d\n”, c); printf(“a=%d, b=%d\n”, a, b);},假設(shè)輸入為: 2 3,10,例9-3 交換兩個(gè)數(shù)a, b的值#

14、include void main(){ int a=5, b=8; int t; printf(“a=%d, b=%d\n”, a, b); t=a; a=b; b=t; printf(“a=%d, b=%d\n”, a, b);},例9-3 交換兩個(gè)數(shù)a, b的值#include void main(){ int a=5, b=8;

15、 int *pa=&a, *pb=&b; int t; printf(“a=%d, b=%d\n”, a, b); t=*pa; *pa=*pb; *pb=t; printf(“a=%d, b=%d\n”, a, b);},11,§9.2 指針變量的定義與引用,●四、指針變量作函數(shù)參數(shù),例9-4 編寫一個(gè)函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換,#includ

16、e void swap (int x, int y){ int t; t=x; x=y; y=t;}void main(){ int a=3, b=5; swap (a ,b ); printf(“%d %d\n”, a,b );},,,#include void swap (int *x, int * y){ int t;

17、 t= * x; * x= * y; * y=t;}void main(){ int a=3, b=5; swap (&a ,&b ); printf(“%d %d\n”, a,b );},void swap (int *x, int * y){ int *t; t= x; x= y; y=t;},void swap (int *

18、x, int * y){ int *t; * t= * x; * x= * y; * y= * t;},*t未賦初值,系統(tǒng)會(huì)隨機(jī)給值,可能指向一個(gè)已有數(shù)據(jù)的存儲(chǔ)單元,再執(zhí)行交換,就會(huì)破壞已有數(shù)據(jù)。,12,例9-5 輸入a,b,c三個(gè)數(shù), 按從大到小輸出#include void swap( int *x, int *y){ int t; t=*x; *x=*y;

19、*y=t;}void main(){ int a, b, c; printf(“enter data a,b,c:”); scanf(“%d%d%d”,&a,&b,&c); if(a<b) swap(&a,&b); if(a<c) swap(&a,&c); if(b<c) swap(&b,&

20、amp;c); printf(“a=%d, b=%d\n”, a, b);},13,§9.3 指針和數(shù)組,●一、一維數(shù)組與指針,1.數(shù)組是連續(xù)存放若干數(shù)據(jù)的集合.,2.數(shù)組名就是指向這個(gè)數(shù)組第1個(gè)元素的指針(首地址) 例如: int a[10], *p; 則 p=a ? p=&a[0];,3. 某一元素地址: p=&a[i]; 引用該元素: *p ? a[i],注意:數(shù)組名a(數(shù)

21、組的指針)與指向數(shù)組首地址的指針變量p不同,a是地址常量不能賦值,也不能進(jìn)行自增自減運(yùn)算。,4. 數(shù)組元素地址在內(nèi)部實(shí)現(xiàn)時(shí),統(tǒng)一按照”基地址+位移”方式處理: 如: a a+1 a+i 故元素的地址可以表示為: p+i a+i(數(shù)組指針),5. 數(shù)組元素的內(nèi)容可以表示為:a[i](數(shù)組下標(biāo)) *(p+i) *(a+i)(指針表示),14,例9-6 讀程序?qū)懗鼋Y(jié)果#include void m

22、ain(){ int a=3, b=5; int *p=&a; printf(“%d\n”, *p); *p=4; p=&b; printf(“%d\n”, *p); *p=6; printf(“%d, %d\n”, a, b);},例9-6 讀程序?qū)懗鼋Y(jié)果#include void main(){ int i, a[5];

23、int *p; for (i=0; i<5; i++) { p=&a[i]; a[i]=i; printf(“%3d”, *p); } printf(“\n”);},例9-6 讀程序?qū)懗鼋Y(jié)果#include void main(){ int i, a[5]; int *p=a; for (i=0; i<5;

24、i++,p++ ) { *p=i; printf(“%3d”, a[i]); } printf(“\n”);},15,§9.3 指針和數(shù)組,●一、一維數(shù)組與指針,數(shù)組指針. 指針變量. 數(shù)組元素之間的關(guān)系,設(shè)有 int a[10], *p=a; 則,地址關(guān)系,內(nèi)容關(guān)系,16,§9.3 指針和數(shù)組,●一、一維數(shù)組與指針,例9-7 讀程序,理解書寫上的變化#in

25、clude void main(){ int i, a[5]; printf(“input 5 numbers:\n”); for (i=0; i<5; i++) scanf(“%d”, &a[i]); printf(“output these numbers:\n”); for (i=0;i<5;i++) printf(“%d ”, a[i]);

26、 printf(“\n”);},scanf(“%d”, a+i);,scanf(“%d”, p+i);,printf(“%d “, *(a+i));,printf(“%d “, *(p+i));,int *p=a;,17,§9.3 指針和數(shù)組,●二、指針的運(yùn)算,1.賦值運(yùn)算: 如: p = &x; p = NULL; p = a;,注:指針類型相同,2. 加減運(yùn)算: 用法: 指針 +(-) 整數(shù)

27、 如: a+i p+i,3. 指針相減的運(yùn)算,求兩地址的間距: 指針 – 指針 如 p-a,注:只能用于數(shù)組元素的引用,注意下標(biāo)的范圍.,注:兩指針類型相同,并指向同一連續(xù)存儲(chǔ)區(qū)域.,4. 移動(dòng)指針運(yùn)算: 如 p++ p--,注:對(duì)數(shù)組名不能實(shí)行移動(dòng),5. 指針比較運(yùn)算: 指針 運(yùn)算符 指針如: p<a比較地址,注: 2~5的運(yùn)算通常應(yīng)用于指向數(shù)組的指針,18,§9.

28、3 指針和數(shù)組,●二、指針的運(yùn)算,例9-8 將a數(shù)組中的內(nèi)容復(fù)制到b數(shù)組中#include #define M 7void main(){ int i, a[M]={23,15,50,3,21,20,35}; int b[M]; for (i=0; i<M; i++) b[i]=a[i]; printf(“output these numbers:\n”);

29、for (i=0;i<5;i++) printf(“%d ”, b[i]); printf(“\n”);},printf(“%d ”,*q++);,,結(jié)果如何?,19,§9.3 指針和數(shù)組,●三、數(shù)組的指針與函數(shù)參數(shù),形式一:void f ( int x[ ], int n){ }void main(){ int a[10]; …… f (a, 10);

30、},數(shù)組名作為函數(shù)參數(shù),實(shí)參與形參對(duì)應(yīng)關(guān)系可歸納為四種情況:,形式二:void f ( int *x, int n){ }void main(){ int a[10]; …… f (a, 10);},形式三:void f ( int *x, int n){ }void main(){ int a[10], *p=a; …… f (p,

31、 10);},形式四:void f ( int x[ ], int n){ }void main(){ int a[10], *p=a; …… f (p, 10);},20,§9.3 指針和數(shù)組,例9-9 編寫一個(gè)函數(shù)求一維數(shù)組最大元素以及下標(biāo)(使用指針).,已知:數(shù)組首地址為p,元素個(gè)數(shù)為n. (作函數(shù)參數(shù))結(jié)果:下標(biāo)k (函數(shù)返回值),int max_

32、array( int *p,int n)設(shè)最大值放在max中,則初始狀態(tài)為: max=*p, k=0;,如果 *(p+i)>max則max=*(p+i), k=i;,#include int max_array(int *p, int n){ int k=0, i, max=*p; for ( i=1; imax) { max=*(p+i); k=i; } return k

33、;}void main(){ int a[10]={23,43,52,23,5,22,33,35,96,34}; int i, *p=a, k; for(i=0; i<10; i++) printf(“%5d”, *(p+i)); k=max_array (a, 10); printf(“max=a[%d]=%d\n”,k,*(p+k));},p+

34、+,i++),*p,*p,*p++;,21,§9.3 指針和數(shù)組,例9-10 編寫一個(gè)函數(shù)將一維數(shù)組倒置存放(使用指針).,已知:數(shù)組首地址為p,元素個(gè)數(shù)為n. (作函數(shù)參數(shù))結(jié)果: 倒置后的一維數(shù)組,函數(shù)定義:int inverse(int a[],int n)或int inverse(int *p,int n),算法:1.令p指向數(shù)組開始,q指向數(shù)組結(jié)束;,#include void inverse

35、(int *p, int n){ int *q, t; q=p+n-1; while(p<q) { t=*p; *p=*q; *q=t; p++; q--;}}void main(){ int a[]={1, 3, 5, 7, 9}; int k, *p=a; for(k=0; k<5; k++) printf(“%4d

36、”, *p++); putchar(‘\n’); inverse (a, 5); for(p=a, k=0; k<5; k++) printf(“%4d”, *p++); putchar(‘\n’);},void inverse(int a[ ], int n){ int *q, t, i=0; q=a+n-1; while(a+i

37、<q) { t=*(a+i); *(a+i)=*q; *q=t; i++; q- -;}},2.交換兩個(gè)單元內(nèi)容;,3.兩個(gè)指針向中央靠攏;,4.重復(fù)2和3,直到p>=q;,22,§9.3 指針和數(shù)組,例9-11 求某班某門課的平均成績,統(tǒng)計(jì)超過平均值的人數(shù)(使用指針完成),分析: 1.令p指向score(存放成績的數(shù)組) 的開始;,2.通過移動(dòng)指針求和;,5.不移動(dòng)指針但通過指針判

38、斷各單元的內(nèi)容是否大于平均值;并記數(shù).,#include #define N 30void main(){ float score[N], *p; float v, s=0; int k, num=0; for(p=score, k=0; kv) num++; printf(“average=%.2f, \ num%d\n”, v ,

39、num);},3.求平均值;,4.令p重新指向score的開始;,23,⑴ 二維數(shù)組的地址 例如:int a[3][4]; ① 二維數(shù)組名a是數(shù)組的首地址。 ② 二維數(shù)組a包含三個(gè)行元素:a[0]、a[1]、a[2] 。,三個(gè)行元素的地址分別是:a、a+1、a+2。而a[0]、a[1]、a[2]也是地址量,是一維數(shù)組名,即*(a+0)、*(a+1)、*(a+2)是一維數(shù)組首個(gè)元素地址。,●四、 二維數(shù)組與指針,

40、67;9.3 指針和數(shù)組,24,⑵ 二維數(shù)組元素的地址 a[0]、a[1]、a[2]是一維數(shù)組名,所以a[i]+j是數(shù)組元素的地址。,數(shù)組元素a[i][j]的地址可以表示為下列形式: &a[i][j]、a[i]+j 、*(a+i)+j,§9.3 指針和數(shù)組,●四、 二維數(shù)組與指針,25,⑶ 二維數(shù)組元素的表示法 數(shù)組元素可用下列形式表示: a[i][j]、*(a[i]+j)、*(*(a+

41、i)+j),a 是二維數(shù)組,根據(jù)C的地址計(jì)算方法,a經(jīng)過兩次 * 操作才能訪問到數(shù)組元素。所以 * a 是 a[0],* * a 才是 a[0][0]。 a[0]是a[0][0]的地址,*a[0]是a[0][0]。,●四、 二維數(shù)組與指針,§9.3 指針和數(shù)組,26,⑷ 指向二維數(shù)組元素的指針變量,【例9-12】用指向數(shù)組元素的指針變量輸出數(shù)組元素。 main( ) { int a[3][4]={{0,

42、1,2,3},{10,11,12,13},{20,21,22,23}}, i, j, *p; for (p=a[0], i=0; i< 3; i++) { for (j=0; j< 4; j++) printf("%4d",*(p+i*4+j)); /* 元素的相對(duì)位置為i*4+j */ printf("\n"); } },這種指

43、針變量的定義及使用與指向一維數(shù)組元素的指針變量是相同的,用它存放二維數(shù)組元素的地址。,,§9.3 指針和數(shù)組,●四、 二維數(shù)組與指針,27,⑸ 指向一維數(shù)組的指針變量 指向一維數(shù)組指針變量的定義形式: 數(shù)據(jù)類型標(biāo)識(shí)符 (*變量名)[元素個(gè)數(shù)],“*”表示其后的變量名為指針類型,[元素個(gè)數(shù)]表示目標(biāo)變量是一維數(shù)組,并說明一維數(shù)組元素的個(gè)數(shù)。由于“*”比“[ ]”的運(yùn)算級(jí)別低,“*變量名”作為一個(gè)說明部分,

44、兩邊必須加括號(hào)。 “數(shù)據(jù)類型標(biāo)識(shí)符”是定義一維數(shù)組元素的類型。,●四、 二維數(shù)組與指針,§9.3 指針和數(shù)組,28,【例9-13】用指向一維數(shù)組的指針變量輸出數(shù)組元素。 main( ) { int a[3][4]={{0,1,2,3},{10,11,12,13},{20,21,22,23}}; int (*lp)[4], i, j; for (lp=a, i=0; i<3; i++)

45、 { for (j=0; j<4; j++) printf("%4d",*(*(lp+i)+j)); printf("\n"); } },,0 1 2 3,10 11 12 13,20 21 22 23,§9.3 指針和數(shù)組,●四、 二維數(shù)組與指針,29,【例9-13】用指向一維數(shù)組的指

46、針變量輸出數(shù)組元素。 main( ) { int a[ ][4]={0,1,2,3,10,11,12,13,20,21,22,23}; int (*lp)[4], j; for (lp=a; lp<a+3; lp++) { for (j=0; j<4; j++) printf("%4d",*(*lp+j)); printf(&q

47、uot;\n"); } },,0 1 2 3,10 11 12 13,20 21 22 23,●四、 二維數(shù)組與指針,§9.3 指針和數(shù)組,30,§9.4 指針和字符串,一、字符串指針,C語言中字符串是以’\0’為結(jié)尾的字符序列;用字符數(shù)組存放字符串(即將以’\0’為結(jié)尾字符數(shù)組看作字符串);字符串指針就是字符數(shù)組的首地址;,如: char a[]=

48、“Apple”; char b[]={‘C’,’h’,’i’,’n’,’a’,’\0’},int *p, *q;p=123;q=&123;*p=123;,定義: char *指針變量,char *p, *q=“Language”;p=“This is a book.”;,二、字符串指針變量,char *p, c[10];p=c;,注意:p是指向字符串首地址,不是存放字符數(shù)組,31,§9.4

49、 指針和字符串,例9-14 逆序打印字符串,算法: 設(shè)字符串為q; 令p指向字符串結(jié)尾; 打印字符*p,并將p向前移動(dòng); 直到p移到字符串首q位置.,#include void main(){ char *p, *q=“Language”; for(p=q; *p!=‘\0’;) p++; for(p--; p>=q; p--) putchar (*p);

50、 putchar(‘\n’);},#include #include void main(){ char *p, *q=“Language”; int n; n=strlen(q); p=q+n; for(p--; p>=q; p--) putchar (*p); putchar(‘\n’);},32,§9.4 指針和字符串,例9-15 編寫一個(gè)

51、函數(shù)判斷一個(gè)字符串是否是回文(順序與逆序相同),已知:字符串指針變量為p (函數(shù)參數(shù))結(jié)果:是(1),否(0) (返回值),int ishuiwen(char *p){ char *q=p; while (*q!=‘\0’) q++; q--; while (p<q) if(*p==*q) {p++; q--;} else return 0;

52、return 1;},算法:1.令q指向最后一個(gè)字符;2.若*p=*q,則兩指針向中間靠攏,直到p>=q,返回1;3.若*p!=*q,則返回0.,int ishuiwen(char *p){ char *q=p; while (*q) q++; q--; while (p<q) if(*p++!=*q--) return 0;

53、 return 1;},33,§9.4 指針和字符串,三、字符數(shù)組與字符指針變量的比較,char a[]=“I love this game”, *p=a;,1.存儲(chǔ)的內(nèi)容不同: 字符數(shù)組可以存字符串,存的是字符; 字符指針變量存的是字符串在內(nèi)存中首地址;,char a[10],*p;p=“china”;a=“china”;,,3.當(dāng)沒有賦值時(shí): 字符數(shù)組名代表了一個(gè)確切的地址; 字符指針變

54、量中的地址是不確定的.,2.賦值方式不同: 字符數(shù)組只能對(duì)各元素賦值;(一次只能賦一個(gè)字符) 字符數(shù)組指針只賦值一次,賦的是數(shù)組首地址.,char a[10],*p;scanf(“%s”, a);scanf(“%s”, p);,34,§9.4 指針和字符串,三、字符數(shù)組與字符指針變量的比較,char a[]=“I love this game”, *p=a;,4. 字符數(shù)組名不是變量,不能改變值; 字

55、符指針變量可以改變值;,char a[10],*p;a++;p++;,,6.字符串指針變量的應(yīng)用: 例如:可以用指針變量指向一個(gè)格式字符串, 在printf中直接使用此指針變量.,5. 可以象數(shù)組那樣使用下標(biāo)引用字符數(shù)組指針變量所指字符串中的字符.,char *p=“abcd”;putchar(p[3]);p[2]=‘x’;,char *fmt=“a=%d, b=%d, c=%d\n”;printf (fmt, a,

56、 b, c);?printf(“a=%d, b=%d, c=%d\n”,a,b,c);,35,§9.4 指針和字符串,三、字符數(shù)組與字符指針變量的比較,7.下列的形式那些是正確的:,char d[10], *q=d; int x=5, *p=&x;d=“apple”; scanf(“%s”,d); printf(“%s”,d);q=“pear”;

57、 scanf(“%s”,q); printf(“%s”,q);*q=“orange”; printf(“%s”, *q);*p=100; scanf(“%d”,p); printf(“%d”,*p);,×,√,√,√

58、,√,√,√,√,×,×,√,36,指針數(shù)組定義的一般形式: 數(shù)據(jù)類型標(biāo)識(shí)符 *數(shù)組名[元素個(gè)數(shù)]; 在這個(gè)定義中由于“[ ]”比“*”的優(yōu)先級(jí)高,所以數(shù)組名先與“[元素個(gè)數(shù)]”結(jié)合,形成數(shù)組的定義形式,“*”表示數(shù)組中每個(gè)元素是指針類型,“數(shù)據(jù)類型標(biāo)識(shí)符”說明指針的目標(biāo)變量的數(shù)據(jù)類型。例如: int *ip[10]; char *cp[5];,1. 指針數(shù)

59、組的定義,指針數(shù)組就是數(shù)組中的每個(gè)元素均為指針類型,§9.5 指針數(shù)組,37,2. 指針數(shù)組初始化,例如:char c[4][8]={"Fortran","COBOL","BASIC","Pascal"};char *cp[4]={c[0],c[1],c[2],c[3]};/*VC中合法,TC中不合法*/char *str[5]={"

60、;int","long","char","float","double"};,§9.5 指針數(shù)組,38,【例9-16】用0~6分別代表星期日至星期六,當(dāng)輸入其中任意一個(gè)數(shù)字時(shí),輸出相應(yīng)英文單詞。 main( ) { char *weekname[7]={"Sunday","Monday&qu

61、ot;,"Tuesday", "Wednesday","Thursday","Friday","Saturday"}; int week; printf("Enter week No.: "); scanf("%d",&wee

62、k); if (week>=0 && week<7) printf("week No.%d —— %s\n",week,weekname[week]); },3. 利用字符指針數(shù)組處理多個(gè)字符串,利用字符指針數(shù)組處理長度不等的字符串,可節(jié)省存儲(chǔ)空間。,§9.5 指針數(shù)組,39,1. 二級(jí)指針變量的定義,,,如果一個(gè)指針的目標(biāo)變量是一個(gè)指針

63、類型變量,則此指針為指向指針的指針變量,也稱為多級(jí)指針變量。,二級(jí)指針變量定義的一般形式: 數(shù)據(jù)類型標(biāo)識(shí)符 **指針變量名; 其中“**指針變量名”相當(dāng)于*(*指針變量名),在括號(hào)中定義了一個(gè)指針變量,括號(hào)外的“*”,說明指針變量(即二級(jí)指針)的目標(biāo)變量是一個(gè)指針類型數(shù)據(jù),“數(shù)據(jù)類型標(biāo)識(shí)符”是目標(biāo)變量(即一級(jí)指針)所指向的數(shù)據(jù)的類型,也就是最終目標(biāo)變量的類型。例如: int a, *p,

64、**pp;,§9.5 多級(jí)指針,40,2. 二級(jí)指針變量初始化,,,例如: int a, *p=&a, **pp=&p;,、*p,、**pp,、*pp,§9.5 多級(jí)指針,41,【例9-17】利用二級(jí)指針輸出字符串。 main( ) { static char *name[ ]={"Zhang","Wang","Li&q

65、uot;,""}; char **pp=name; while (**pp!='\0') printf("%s\n",*pp++); },*(*pp+1)=h、*(*pp+2)=a,,Zhang,Wang,Li,§9.5 多級(jí)指針,42,1,一維數(shù)組的指針作函數(shù)參數(shù),一. 數(shù)組的指針作函數(shù)參數(shù),2,二維數(shù)組的指針作函數(shù)參數(shù),由

66、于指向二維數(shù)組的指針分為行指針和元素指針,所以他們作為函數(shù)參數(shù)的形式也不同。,① 二維數(shù)組的行指針作函數(shù)參數(shù) 例如被調(diào)函數(shù)abc的定義形式有以下三種: void abc(int b[2][4]) { …… } void abc(int b[ ][4]) { …… } void abc(int (*b)[4]) { …… } 在主調(diào)函數(shù)有如下定義: int a

67、[2][4], (*p)[4]=a; 則調(diào)用abc函數(shù)時(shí)可用 abc(a) 或 abc(p),§9.5 指針與函數(shù),43,【例9-18】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為行指針。void inarr(int (*p1)[4],int m) /* 可改寫為void inarr(int p1[ ][4],int m) */{ int i,j; for (i=0; i<

68、m; i++) for (j=0; j<4; j++) scanf("%d",*(p1+i)+j);}void outarr(int (*p2)[4],int m) /* 可改寫為void outarr(int p2[3][4],int m) */{ int i,j; for (i=0; i<m; i++) { for (j

69、=0; j<4; j++) printf("%6d",p2[i][j]); printf("\n"); } },一. 數(shù)組的指針作函數(shù)參數(shù),§9.5 指針與函數(shù),void main( ){ int a[3][4],(*p)[4]; p=a; inarr(a,3); outarr(p,3);},44,一. 數(shù)組的

70、指針作函數(shù)參數(shù),2, 二維數(shù)組的指針作函數(shù)參數(shù) ② 指向二維數(shù)組元素的指針作函數(shù)參數(shù),指向二維數(shù)組元素的指針作函數(shù)參數(shù)時(shí),是利用二維數(shù)組元素按行連續(xù)存儲(chǔ)的的特點(diǎn),訪問數(shù)組的每一個(gè)元素。被調(diào)函數(shù)的形參必須定義為指向二維數(shù)組元素的指針變量。,例如被調(diào)函數(shù)abc的定義形式如下: void abc(int *b) { …… }在主調(diào)函數(shù)有如下定義: int a[2][4], *p=a[0];則調(diào)用abc函數(shù)時(shí)可用

71、 abc(a[0])、abc(&a[0][0]) 或 abc(p),§9.5 指針與函數(shù),45,【例9-19】用函數(shù)輸入輸出整型二維數(shù)組,函數(shù)的形參為指向二維數(shù)組元素的指針。 void inarr(int *p1, int m,int n) { int i,j; for (i=0; i<m; i++) for (j=0; j<n; j++)

72、 scanf("%d",p1+n*i+j); },void outarr(int *p1, int m, int n){ int i,j; for (i=0; i<m; i++) { for (j=0; j<n; j++) printf("%6d",*(p1+n*i+j)); printf("\n"); }

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論