11.若有下面的程序片段,則對數(shù)組元素的錯(cuò)誤弓D用是( )
int a[12]={0},*p[3],* *pp,i;
for( i=0;i 3;i++) p= a[i+4];
pp= P;
①pp[0][1] ②a[10]
③ p[3][l] ④*(*(p+2)+2)
解 上述代碼定義變量a是有12個(gè)整型元素的數(shù)組,它的初值全是0.p是有三個(gè)元素的指針數(shù)組,每個(gè)指針能指向整型變量。哪是指針的指針,它能指向一個(gè)指向整型變量的指針, i是一個(gè)整型變量。執(zhí)行代碼for(i=0;i 3;i++) P= a[i+4] 使指針數(shù)組 p的元素 p[0]指向 a[4] ,p[l]指向a[5] ,p[2]指向 a[6].代碼pp=p使指針變量pp指向p[0].①代碼pp[0][l] 用指針表達(dá)可等價(jià)地寫成*(*pp+l)。其中*pp就是 p[0],p[0]的值是 a[4],*pp+1的值是 a[4]+1= a[5],*(*pp+1)就是a[5].②代碼a[l0] 當(dāng)然是引用數(shù)組a的元素。③代碼p[3][1]數(shù)組p只有三個(gè)元素,沒有p[3],所以是錯(cuò)誤的。④代碼*(*(p+2)+2)中的(p+2)是 p[2],*(p+2)是 p[2],其值是 a[6],*(p+2)+2的值是 a[8],*(*(p+2)+2)引用的是a[8].所以解答是@.
12.若有如下定義和語句,則輸出結(jié)果是( )
int * *pp, *p,a=10,b=20;
PP= p; P= a; P= b; printf( %d%d\n ,*p,* *PP);
①10, 20 ② 10, 10
③ 20, 10 ④ 20, 20
解 上述代碼定義變量pp是指針的指針,它能指向一個(gè)指向整型變量的指針。定義變量p是指針,它能指向一個(gè)整型變量。a是一個(gè)整型變量,它有初值10.b也是一個(gè)整型變量,它有初值20.代碼 pp= p 使pp指向p,p= a使p指向a,p= b又使p指向b,不再指向a.所以。p是引用b,其值為20.* *pp是通過pp間接引用p,再通過p間接引用b,所以也是20.所以解答是④。
13.若有以下定義和語句,則對w數(shù)組元素的非法引用是( )
int w[2][3],(* pw)[3]; pw= w;
① *(w[0]+2) ②*pw[2]
③pw[0][0] ④*(pw[l]+2)
解 上述代碼定義2行3列的二維數(shù)組w,定義能指向有3個(gè)整型元素一維數(shù)組的指針pw,并讓pw指向數(shù)組w的第一行。①代碼*(w[0]+2)中的w[0]是 w[0][0],w[0]+2是 w[0][2],所以*(w[0]+2)就是w[0][2].②代碼*pw[2]中的pw[2]是 w[2][0],該數(shù)組w只有2行,沒有w[2][0],所以代碼*pw[2]是對數(shù)組W元素的非法引用。③代碼pw[0][0]就是w[0][0].④代碼*(pw[l]+2)中的pw[1]就是*(pw+l),即 w[l][0],pw[l]+2就是 w[l][2],所以*(pw[1]+2)就是w[1][2].所以解答是②。
5.2 填充題
1. * 稱為___________運(yùn)算符, 稱為_________運(yùn)算符。
解 單目運(yùn)算符 * 稱為取內(nèi)容運(yùn)算符,單目運(yùn)算符 稱為取地址運(yùn)算符。
2.若兩個(gè)指針變量指向同一個(gè)數(shù)組的不同元素,可以進(jìn)行減法運(yùn)算和___________運(yùn)算。
解 若兩個(gè)指針變量指向同一個(gè)數(shù)組的不同元素,可以進(jìn)行減法運(yùn)算求它們所指元素相差多少元素。進(jìn)行關(guān)系運(yùn)算,判定它們所指元素的前后,或是否指向同一個(gè)元素等。
3.設(shè) int a[10] ,*p=a;則對a[3]的引用可以是p[______________] 和*(p_________)。
解 若指針p指向數(shù)組a的首元素,則引用a[3]用指針p可以寫成p[3]和*(p+3)。
4.若d是已定義的雙精度變量,再定義一個(gè)指向d的指針變量p的代碼是___________.
解 若d是一個(gè)雙精度變量,定義能指向它的指針變量p可以用以下代碼double *p= d.
5. 后跟變量名,表示該變量的_________;*后跟指針變量名,表示該指針變量_______. 后跟的是指針變量名,表示該指針變量的_____________.
解 單目運(yùn)算符 是取地址運(yùn)算符, 后跟變量名,就表示該變量的地址。單目運(yùn)算符*是取內(nèi)容運(yùn)算符,*后跟指針變量名,表示該指針變量所指變量的內(nèi)容。若 后跟的是指針變量名,就表示該指針變量的地址。若知道指針變量的地址,欲通過指針變量的地址引用指針變量所指變量的內(nèi)容,需要連續(xù)兩次取內(nèi)容運(yùn)算。
6.設(shè)有char *a= ABCD ,則printf( %s ,a)的輸出是_______;而printf( %c ,*a)的輸出是______.
解 若給字符指針變量a賦一個(gè)字符串常量 ABCD ,實(shí)際上是給a賦指向字符串常量首字符 A 的指針。程序通過它訪問字符串中的各字符。如用代碼printf( %s ,a) 輸出這個(gè)字符串常量 ABCD 的字符列ABCD,用代碼printf( %c ,*a)輸出a所指的字符 A.
7.設(shè)有以下定義和語句,則*(*(p+2)+l)的值為__________.
int a[3][2]={10,20,30,40,50,60},(*p)[2];
p= a;
解 上述代碼定義3行2列的二維數(shù)組a ,定義指向兩個(gè)元素的一維數(shù)組指針p,并讓p指向二維數(shù)組a的首行。則代碼*(*(p+2)+l)中的p+2指向二維數(shù)組a的第2行a[2],*(p+2)指向a[2][o],*(p+2)+l指向a[2][l],*(*(p+2)+l)是引用a[2][l],其值是60.
8.以下程序的功能是從鍵盤上輸入若干個(gè)字符(以回車符作為結(jié)束)組成一個(gè)字符串存入一個(gè)字符數(shù)組,然后輸出該字符數(shù)組中的字符串。請?zhí)羁铡?/p>
# include
# include
main()
{ char str[81],*sptr;
int i;
for(i=0;i 80;i++)
{ str=getchar();if(str== \n ) break;}
str=____________;
sptr=str;
while(* sptr) putchar(* sptr______________);
}
解 從鍵盤輸入字符行,通過循環(huán)逐一輸入字符,當(dāng)發(fā)現(xiàn)輸入字符是換行符時(shí),結(jié)束循環(huán)。為了使輸入的字符列變成字符串,必須在輸入字符列之后,原存儲(chǔ)換行符的元素改為存儲(chǔ)字符串的結(jié)束標(biāo)記符,需用代碼 str= \0 ,所以在第一框填入代碼 \0 。當(dāng)要將存于字符數(shù)組str中的字符串通過循環(huán)逐一輸出字符串的字符時(shí),可以用字符指針sptr,讓sptr遍歷整個(gè)字符串,每次循環(huán)時(shí),輸出sptr所指字符,并讓sptr增1,即可用代碼*sptr++實(shí)現(xiàn),所以在第二框填入代碼++.
5.3 程序分析題
1.閱讀下列程序,寫出程序的輸出結(jié)果。
main()
{char *a[6]={ AB , CD , EF , GH ,U , KL };
int i;
for(i=0;i 4;i++) printf( %s , a);
printf( \n );
}
解 程序定義了有六個(gè)元素的字符指針數(shù)組a ,數(shù)組a 的各元素指向字符率常量。
程序的for循環(huán)遍歷了a的前四個(gè)元素,用字符率輸出格式,輸出指針數(shù)組a前四個(gè)元素所指的字符串。所以程序輸出: ABCDEFGH.
2.閱讀下列程序,寫出程序的主要功能。
main()
{ int i,a[l0],*p= a[9] ;
for(i=0;i 10;i++) scanf( %d , d);
for(; p =a; p ) printf( %d\n ,*p) ;
}
解 程序定義了有10個(gè)元素的整型數(shù)組a,另定義指針變量p,并讓它指向a的最后一個(gè)元素a[9].執(zhí)行代碼的第一個(gè)循環(huán)是順序輸人數(shù)組a的10個(gè)元素。第二個(gè)循環(huán)利用指針p逆序遍歷數(shù)組a,將數(shù)組a的各元素逆序輸出。所以程序的功能是輸入10個(gè)整數(shù),并逆序輸出這10個(gè)整數(shù)。