6指针 联系客服

发布时间 : 星期一 文章6指针更新完毕开始阅读58782b4bb14e852459fb574c

指 针

一、单项选择题

1.对于同类型的指针变量,不可能进行的运算是( C )。 A.- B.= A.int *p=&i,i;

C.+ B.int *p, i;

D.==

C.int i, *p=&i; C.int x=3,*p=x;

D.int t, *p; D.int *p=&x=3;

2.下列不正确的定义是( A )。 3.下列正确的定义是( B )。 A.int x=3,*p=1; B.int x=3,*p;

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 A.i=*p;

B.24 B.*p=*&j;

C.25 C.i=&j;

D.26 D.i=**p;

11.若有说明:int i, j=7,*p=&i; 则与 i=j;等价的语句是( B )。 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] A.a[p]

16.若有以下定义,且0<=i<5, 则对数组元素地址的正确表示是( D )。 int a[ ]={1,2,3,4,5},*p=a, i;

B.*p+2 B.p[a]

C.*(a+2) C.*(p+2)

D.*a++ D.p+2

15.若有说明语句 int a[5], *p=a; 对数组元素的正确引用是( C )。

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”; 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

A.”abcd”

B.?d?

C.p+=3,*p++ C.’\\0’

D.p+=2,++*p; D.不能确定

20.执行语句 char a[10] ={“abcd”},*p=a 后,*(p+4)的值是( C )。

D.char *s; scanf(“%s”,&s);

18.若有以下定义,则 *(p+5) 的值为( B )。

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.&后跟变量名,表示取该变量的 地址 ,

*后跟指针变量名,表示取该指针变量 所指的变量值 , &后指针变量名,表示取该指针变量的 地址 。

10.设有int sz[4], p=sz; 有 sz[i] , p[i] , *(sz+i) 和 *(p+i) 四种不同的引用数组 元素的方法。

11.设有char *a=”ABCD”; , 则printf(“%s”,a);的输出是 ABCD ;而printf(“%c”,*a);的输 出是 A 。

12. 定义a为共有5个元素的一维整型数组、同时定义p为指向a数组首地址的指针变量的语句为 int a[5], *p=a;

13. 定义a为4行5列的二维整型数组、同时定义p为指向a数组首地址的指针变量的 语句为 int a[4][5], **p=a; 。

14.设有以下定义和语句,则 **(p+2) 的值为 50 。

int a[3][2] ={10,20,30,40,50,60}, (*p)[3];

p=a;

15.以下程序用指针指向三个整型存储单元,输入三个整数,选出其中最小值并输出,请填空。

#include void main( )

{ int *min, *a,*b,*c ; a=(int *)malloc(sizeof(int)); b=(int *)malloc(sizeof(int)); b=(int *)malloc(sizeof(int)); min=(int *)malloc(sizeof(int));

printf(“输入三个整数:\\n”); scanf(“%d%d%d”, a, b, c ); printf(“输出这三个整数:%d %d %d \\n”, *a, *b, *c ); *min=*a;

if(*a>*b) *min=*b ; if( *min >*c) *min=*c ;

printf(“输出最小整数: %d\\n”, *min ); }

16.以下程序的功能是从键盘上输入若干个字符(以回车键作为结束)组成一个字符串存入 一个字符数组,然后输出该字符数组中的字符串。请填空。

#include “stdio.h” #include “ctype.h” void main( ) { char str[81],*sptr; int i;

for(i=0;i<80;i++)

{ str[i] =getchar(); if (str[i] ==?\\n?) break; } str[i] = ’\\0’ ; sptr=str; while(*sptr) putchar(*sptr ++ ); }

17.以下程序从输入的10个字符串中找出最长的那个串及长度。请填空。

#include #include void main( )

{ char str[10][80], *sp; int i; for(i=0;i<10;i++) gets(str[i]); sp= str[0] ;

for(i=0;i<10;i++) if(strlen(sp)

printf(“输出最长的那个串的长度:%d\\n”, strlen(sp) );