指 针
一、单项选择题
1.对于同类型的指针变量,不可能进行的运算是( C )。
A.- B.= C.+ D.==
2.下列不正确的定义是( A )。
A.int *p=&i,i; B.int *p, i; C.int i, *p=&i; D.int t, *p;
3.下列正确的定义是( B )。
A.int x=3,*p=1; B.int x=3,*p; C.int x=3,*p=x; D.int *p=&x=3;
4. 下列语句定义p为指向float类型变量d的指针,其中哪一个是正确的( B )。
A、float d,*p=d; B、float d,*p=&d; C、float *p=&d,d; D、float d,p=d;
5. 对语句“int a[10],*p=a;”,下列表述中哪一个是正确的( D )。
A、*p被赋初值为a数组的首地址 B、*p被赋初值为数组元素a[0]的地址
C、p被赋初值为数组元素a[1]的地址 D、p被赋初值为数组元素a[0]的地址
6.设有定义 int a=1,b,*p=&a; 则下列语句中使b不为a的语句是( D )。
A.b=*&a; B.b=*p; C.b=a; D.b =*a;
7. p1指向某个整型变量,要使指针p2也指向同一变量,哪一个语句是正确的( A )。
A、p2=p1; B、p2=**p1; C、p2=&p1; D、p2=*p1;
8. 假如指针p已经指向变量x,则&*p相当于( C )。
A、x B、*p C、&x D、**p
9. 假如指针p已经指向某个整型变量x,则(*p)++相当于( B )。
A、p++ B、x++ C、*(p++) D、&x++
10.设指针x指向的整型变量值为25,则printf(“%d\n”,++*x);的输出是( D )。
A.23 B.24 C.25 D.26
11.若有说明:int i, j=7,*p=&i; 则与 i=j;等价的语句是( B )。
A.i=*p; B.*p=*&j; C.i=&j; D.i=**p;
12. 若有说明:char ch, *p; 则p不能正确获得值的语句是( A )。
A.*p=getchar( ); B.p=&ch; scanf(“%c”, p);
C.p=(char *)malloc(1); *p=getchar( ); D.p=&ch; *p=getchar( );
13.若有说明语句int a[ ]={1,2,3,4,5}, *p=a, i; 且0<=i<5, 则对数组元素错误的引用是( C )。
A.*(a+i) B.a[p-a] C.p+1 D.*(&a[i])
14.若有说明语句 int a[5], *p=a; 对数组元素的正确引用是( C )。
A.*&a[5] B.*p+2 C.*(a+2) D.*a++
15.若有说明语句 int a[5], *p=a; 对数组元素的正确引用是( C )。
A.a[p] B.p[a] C.*(p+2) D.p+2
16.若有以下定义,且0<=i<5, 则对数组元素地址的正确表示是( D )。
int a[ ]={1,2,3,4,5},*p=a, i;
A.&(a+i) B.a++ C.&p D.&p[i]
17.下面各语句中,能正确进行赋字符串操作的语句是( C )。
A.char s[5] =”ABCDE”; B.char s[5] ={‘A’,‘B’, ‘C’,‘D’, ‘E’};
C.char *s; s=”ABCDE”; D.char *s; scanf(“%s”,&s);
18.若有以下定义,则 *(p+5) 的值为( B )。
char s[ ]=”Hello”, *p=s;
A.’0’ B.’\0’ C.’0’的地址 D.不确定的值
19.若有以下的定义,则值为3的表达式是( A )。
int a[10] ={1,2,3,4,5,6,7,8,9,10}, *p=a;
A.p+=2,*(p++) B.p+=2,*++p C.p+=3,*p++ D.p+=2,++*p;
20.执行语句 char a[10] ={“abcd”},*p=a 后,*(p+4)的值是( C )。
A.”abcd” B.’d’ C.’\0’ D.不能确定
21. 数组定义为“int a[4][5];”,引用“a+3”表示( C )。
A、a数组第3列的首地址 B、a数组第0行第3列元素的值
C、a数组第3行的首地址 D、a数组第0列第3行元素的值
22. 数组定义为“int a[4][5];”,引用“a[1]+3”表示( A )。
A、a数组第1行第3列元素的地址 B、a数组第1行第3列元素的值
C、a数组第4行的首地址 D、a数组第4列的首地址
23. 数组定义为“int a[4][5];”,引用“*(*a+1)+2”表示( C )。
A、a[1][0]+2 B、a数组第1行第2列元素的地址
C、a[0][1]+2 D、a数组第1行第2列元素的值
24. 数组定义为“int a[4][5];”,下列哪一个引用是错误的( D )。
A、*a B、*(*(a+2)+3) C、&a[2][3] D、++a
25.若有定义 int a[3][4]; 则对数组元素a[i][j] (0<=i<3,0<=j<4) 正确的引用是( B )。
A.*(a+4*i+j) B.*(*(a+i)+j) C.*(a+i)[j] D.a[i] +j
26.若有定义 int a[3][4],*p; 则对数组元素a[i][j](0<=i<3,0<=j<4)正确的引用是( C D )。
A.p=a B.p=a, *(*(p+i)+j) C.p=a[0], *(p+i*4+j) D.*(*(a+i)+j)
27.若有定义int a[3][4], (*p)[3];则对数组元素a[i][j] (0<=i<3,0<=j<4) 正确的引用是( D )。
A.p=a[i] B.p=&a[i][j] C.p=a, *(p+i*4+j) D.p=a, *(*(p+i)+j)
28.若有定义int a[3][4], *p, *q[3]; 且0<=i<3,则错误的赋值语句是( A )。
A.p=a B.q[i]=a[i] C.p=a[i] D.q[i]=&a[2][0]
29.设有定义语句 int (*ptr)[10]; 其中的ptr是( C )。
A.10个指向整型变量的函数指针
B.指向10个整型变量的函数指针
C.一个指向具有10个元素的一维数组的指针
D.具有10个指针元素的一维数组
30.若有以下定义,则数值为4的表达式是( D )。
int w [3][4] ={{0,1},{2,4},{0,1},{0,1}}, (*p)[4]=w;
A.* w [1]+1 B.p++, *(p+1) C.w [2][2] D.p[1][1]
31.若有下面的程序片段,则对数组元素的错误引用是( C )。
int a[12] ={0}, *p[3], **pp, i;
for(i=0; i<3; i++) p[i]=&a[i*4];
pp=p;
A.pp[0][1] B.a[10] C.p[3][1] D.*(*(p+2)+2)
指针变量本身有地址吗32.若有如下定义和语句,则输出结果是( D )。
int **pp, *p, a=10, b=20;
pp=&p; p=&a; p=&b; printf(“%d,%d\n”, *p, **pp);
A.10, 20 B.10, 10 C.20, 10 D.20, 20
33.若有以下定义和语句,则对w数组元素的非法引用是( B )。
int w [2][3], (*pw)[3]; pw=w;
A.*(w [0]+2) B.*pw [2] C.pw [0][0] D.*(pw [1]+2)
二、填充题
1.C语言中,数组名是一个 地址 常量,不能对它进行 加减 和 赋值 运算。
由 数组名 代表它的首地址。
2.在C程序中,指针变量只能赋 地址 值和 NULL 值。
3.在C程序中,指针变量可以通过 取地址运算符 , 相互赋值 , 赋NULL
三种方式赋值。
4.在C程序中,可以对指针变量进行 加减整数 和 ++,---- 来移动指针。
5.单目运算符“*”称为 间接访问 运算符,“&”称为 取地址 运算符。
6.若两个指针变量指向同一个数组的不同元素,可以进行减法运算和 比较 运算。
7.设int a[10], *p=a; 则对a[3] 的引用可以是p[ 3 ] 和 *(p +3 )。
8.若d是已定义的双精度变量,再定义一个指向d的指针变量p的语句是double *p=&a 。
9.&后跟变量名,表示取该变量的 地址 ,
*后跟指针变量名,表示取该指针变量 所指的变量值 ,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论