当前位置:文档之家› C语言指针单元练习

C语言指针单元练习

C语言指针单元练习
C语言指针单元练习

《C程序设计》函数单元练习

学号姓名

一、选择题

1、对于同类型的指针变量P1和P2,不可能进行的运算是

A.p1-p2 B. p1=p2

C. p1+p2

D. p1==p2

2、下列不正确的定义是

A. int *p=&i,i;

B. int *p=0, i;

C. int i, *p=&i;

D. int t, *p=0;

3、下列正确的定义是

A. int x=3,*p=1;

B. int x=3,*p=0;

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

D. int *p=&x=3;

4、下列语句定义p为指向float类型变量d的指针,其中正确的是

A. float d=0,*p=d;

B. float d=0,*p=&d;

C. float *p=&d,d=0;

D. float d=0,p=d;

5、对语句“int a[10],*p=a;”,下列表述中正确的是

A. *p被赋初值为a数组的首地址

B. *p被赋初值为数组元素a[0]的地址

C. p被赋初值为数组元素a[1]的地址

D. p被赋初值为数组元素a[0]的地址

6、设有定义 int a=1, b, *p=&a; 则下列语句中使b不等于a的语句是

A. b=*&a;

B. b = *p;

C. b=a;

D. b = *a;

7、p1指向某个整型变量,要使指针p2也指向同一变量,语句正确的是

A. p2=p1;

B. p2=**p1;

C. p2=&p1;

D. p2=*p1;

8、假如指针p已经指向变量x,则&*p相当于

A. x

B. *p

C. &x

D. **p

9、若有说明:int i, j=7,*p=&i; 则与 i=j;等价的语句是

A. i=*p;

B. *p=*&j;

C. i=&j;

D. i=**p;

10、若有说明语句 int a[5], *p=a; 对数组元素的正确引用是

A. a[p]

B. p[a]

C. *(p+2)

D. p+2

11、假如指针p已经指向某个整型变量x,则(*p)++相当于

A. p++

B. x++

C. *(p++)

D. &x++

12、若有以下定义,且0<=i<5, 则对数组元素地址的正确表示是

int a[ ]={1,2,3,4,5},*p=a, i;

A. &(a+i)

B. a++

C. &p

D. &p[i]

13、若有以下定义,则 *(p+5) 的值

char s[ ]=”Hello”, *p=s;

A. '0'

B. '\0'

C. '0'的地址

D. 不确定的值

14、数组定义为“int a[4][5];”,引用“a+3”表示

A. a数组第3列的首地址

B. a数组第0行第3列元素的值

C. 数组第3行的首地址

D. a数组第0列第3行元素的值

15、数组定义为“int a[4][5];”,引用“*(*a+1)+2”表示

A. a[1][0]+2

B. a数组第1行第2列元素的地址

C. a[0][1]+2

D. a数组第1行第2列元素的值

16、设指针x指向的整型变量值为25,则printf("%d\n",++*x);的输出是

A. 23

B. 24

C. 25

D. 26

17、下面各语句中,能正确进行赋字符串操作的语句是

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、有定义如下:int a[5], *p; 则下列描述错误的是

A.表达式p=p+1是合法的

B.表达式a=a+1是合法的

C.表达式p-a是合法的

D.表达式a+2是合法的

19、执行完C程序中的下列三条语句之后c指向

int a, b, *c=&a; int *p= c; p= &b;

A.p B. c C. b D.a

20、字符串常量"ME"的字符个数为

A.4 B. 3 C. 2 D. 1

21、下列对字符数组进行初始化的语句正确的是

A.char a[]= “Hello”;

B. char a[][]= {'H’,’e’,’l’,’l’,’o’};

B.char a[5]=“Hello”;

D. char a[2][5]= {"Hello","World"}

22、下列关于指针运算的描述错误的

A.在一定条件下,两个指针可以相加

B. 在一定条件下,两个指针可以进行逻辑判断

C. 在一定条件下,指针可以为空值

D. 在一定条件下,两个指针可以相互赋值

23、int a= 10,*p=&a;语句中,p的值

A.10 B. 变量p的地址值

C. 变量a的地址值

D.无意义

24、在下列四种字符串说明或赋值方式中,不正确的是:

A. char *p;p=“I am a student”;

B. char p1[8]={‘s’,’t’,’u’,’d’,’e’,’n’,’t’};

C. char p2[20] ;p2=“I am a student”;

D. char p3[ ]=“student”,p4[ ]=“teacher”;

25、有说明语句char *name="newspaper"; 则可获取串中字符's'

A. name[0]+3

B. *name+3

C. *(name+3)

D. name[4]

26、设有变量定义:int aval=2005;int *ap;double *dp;下面赋值正确的是

A. ap=aval;

B. *ap=&aval;

C. dp=ap;

D. *dp=*ap

27、int a[ 3] [ 3] , *p, i; p=&a[0] [0] ; for(i=0; i<9; i++) p[i] =i; for(i=0;

i<3; i++) printf("%d ", a[1] [i] ) ; 程序运行后的输出结果

A. 0 1 2

B.1 2 3

C. 2 3 4

D.3 4 5

28、有以下程序int a[ 3] [ 3] , *p, i; p=&a [0] [0] ; for ( i=0 ; i<9 ; i++) p[i]

=i+1; printf("%d\n", a[1] [2] ) ; 程序运行后的输出结果是

A. 3

B. 6

C. 9

D. 2

29、 int i, x[3] [3] ={ 9, 8, 7, 6, 5, 4, 3, 2, 1} , *p=&x[ 1] [ 1] ;

for(i=0; i<4; i+=2) printf("%d ", p[i] ) ;的输出结果是

A. 5 2

B. 5 1

C. 5 3

D. 9 7

30、执行以下程序段后, int a[2] [3] ={ { 1, 2, 3} , { 4, 5, 6} } ; int m, *p; p=&a[0]

[0] ; m=(*p) *(*(p+2) ) *(*(p+4) ) ; m的值为

A. 15

B. 14

C. 13

D. 12

31、指针可以用来表示数组元素,下列表示中____________是错误的。

已知:int a[3][7];

A.*(a+1)[5]

B.*(*a+3)

C.*(*(a+1))

D.*(&a[0][0]+2)

32、设有说明语句“int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int *p=&a[0][0];”,

能够正确表示数组元素a[2][2]的表达式是__________

A.p[2][2]

B.*(*(p+2)+2)

C.*(p+10)

D.*(p+8)

33、以下程序执行后,a的值是_______。

main()

{ int a,k=4,m=6,*p1=&k,*p2=&m;

a=p1==&m;

printf("%d\n",a);

}

A) 4 B) 1 C) 0 D) 运行时出错,a无定值

34、下列程序的运行结果是_______ 。

void fun(int *a,int *b)

{ int *k;

k=a;

a=b;

b=k;

}

main()

{ int a=3,b=6,*x=&a,*y=&b;

fun(x,y);

printf("%d%d",a,b);

}

A) 63 B) 36 C) 编译出错D) 00

35、设有以下程序:

main()

{ int a,b,k=4,m=6,*p1=&k,*p2=&m;

a=p1==&m;

b=(*p1)/(*p2)+7;

printf("a=%d\n",a);

printf("b=%d\n",b);

}

执行该程序后,a的值为【1】,b的值为【2】。

36、有以下程序

void fun(char *c,int d)

{ *c=*c+1;

d=d+1;

printf("%c,%c,",*c,d);

}

main()

{ char a='A',b='a';

fun(&b,a);

printf("%c,%c\n",a,b);

}

程序运行后的输出结果是_______。

A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b

37、有以下程序

int fa(int x)

{ return x*x; }

int fb(int x)

{ return x*x*x; }

int f(int (*f(1)(),int (*f2)(),int x)

{ return f2(x)-f1(x); }

main()

{ int i;

i=f(fa,fb,2);

printf("%d\n",i);

}

程序运行后的输出结果是___ ____。

A) -4 B) 1 C) 4 D) 8

38、若有一些定义和语句

#include

int a=4,b=3,*p,*q,*w;

p=&a;

q=&b;

w=q;

q=NULL;

则以下选项中错误的语句是_______。

A) *q=0; B) w=p; C) *p=va; D) *p=*w;

39、有以下程序

int *f(int *x,int *y)

{ if(*x<*y) return x;

else return y;

}

main()

{ int a=7,b=8,*p,*q,*r;

p=&a;

q=&b;

r=f(p,q);

printf("%d,%d,%d\n",*p,*q,*r);

}

执行后输出结果是_______。

A) 7,8,8 B) 7,8,7 C) 8,7,7 D) 8,7,8

40、下列程序段的输出结果是_______。

A) 2 1 4 3 B) 1 2 1 2 C) 1 2 3 4 D) 2 1 1 2

void fun(int *x, int *y)

{ printf("%d %d", *x, *y);

*x=3;

*y=4;

}

main()

{ int x=1,y=2;

fun(&y,&x);

printf("%d %d",x, y);

}

41、已有定义int k=2; int *ptr1,*ptr2;且ptrl和Ptr2均已指向变量k,下

面不能正确执行的赋值语句是

A)k=*ptrl+*ptr2; B)ptr2=k

c)ptrl=ptr2; D)k=*ptrl*(*ptr2);

42、若已定义int a=5;下面对(1),(2)两个语句的正确解释是

(1)int *p=&a; (2)*p=a;

A)语句(1)和(2)中的*p含义相同,都表示给指针变量p赋值

B)(1)和(2)语句的执行结果,都是把变量a的地址值赋给指针变量p

C)(1)在对p进行说明的同时进行初始化,使p指向a (2)将变量a的值赋给指针变量p

D)(1)在对p进行说明的同时进行初始化,使p指向a (2)将变量a的值赋于*p

43、若有证明:int *p1,*p2,m=5,n;以下均是正确赋值语句的选项是

A)p1=&m;p2=&p1;

B)p1=&m;p2=&n;*p1=*p2;

C)p1=&m;p2=p1

D)p1=&m;*p2=*p1

44、己有变量定义和函数调用语句:int a=25 ;print_vaue(&a);下面函数的

正确输出结果是

void print_value(int *x)

{printf("%d\n",++*x);}

A)23 B)24 C)25 D)26

45、以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是

main()

{int *p,*q,a,b;

p=&a;

printf("input a:");

scanf("%d",*p);

}

A)*p表示的是变量p的地址

B)*p表示的是变量a的值,不是变量a的地址

C)*p表示的是指针变量p的值

D)*p只能用来说明p是一个指针变量

二、填空题

1、int a[5]={100, 200, 300, 400, 500}, *p1=&a[0]; *(p1++)的值是

2、若有说明语句char *name="newspaper"; 则*(name+3)获取串中的字符

是,而printf(“%s”, name+2);的输出结果是

3、定义 char s[ ]=“abc”;后,字符数组s长度是。

4、在如下定义中 float a[ ]={100,200,300}; float *p[ ]={&a[0], &a[1], &a[2]}; 则

输出*p[2]的值是。

5、字符串存储的时候自动在最后一个字符处加字符结束符号。

6、有如下定义中char *str[ ]={“Follow me”, “BASIC”, “Great Wall”,

“Department”}中输出”BASIC”字符串的语句是:。

7、有如下定义int *p1, i=100; 执行完p1=&i; *p1=*p1+200; 语句之后i的值

是。

8、int a[4]={100,200,300,400},b,* p=a; 则执行语句b=*p++; 后b的值

是,接着执行语句b=*++p; 后,b的值是,再执行语句b=++*p; 后b的值是。

三、阅读题

1、void main(void)

{

char str[]="Visual_C++", *sp=str;

printf("%d\n ",sizeof(str));

printf("%d\n",strlen(str)); sp+=7;

printf("%s\n ",sp);

}

程序第一行输出,第二行输出,第三行输出

2、void swap(int *p1, int *p2)

{

int *p;

p=p1; p1=p2; p2=p;

printf("%d\t%d\n",*p1,*p2);

}

void main(void)

{

int a=5, b=9;

swap(&a, &b);

printf("%d\t%d\n",a,b);

}

程序第一行输出,第二行输出。

3、void exchange(int *x, int *y)

{

int temp;

temp=*x;

*x=*y;

*y=temp;

}

void main(void)

{

int i,j,data[8]={15,12,20,0,8,-5,17,1};

for(i=0;i<=7;i++){

for (j=i;j<=7;j++){

if(data[i]>data[j])

exchange(&data[i], &data[j]);

}

printf("%d\n ",data[i]);

}

}

函数exchange的作用是:,&data[i]表示的是:,程序的输出结果是:_ 。

4、写出以下程序执行时的屏幕输出

void invert(char*a,int x,int y){

char t,*p,*q;

P=a+x;

q=a+y;

while(p

t=*p;

*p=*q;

*q=t;

p++;q--;

}

}

void main()

{ char dt[13]=“GoodBookNice”;

int i=0,n=1,j;

while(i<8){

invert(dt,i,i+5);

for(j=i;j<=i+5;j++) printf("%c,",dt[j]);

printf("\n");

i+=6:

}

}

5、写出执行下面程序的输出结果。

#include

#include

char *readstr(char *a,int k,int m,int n)

{

char *s,*p;

int i=0;

s=(char *)malloc(n);

p=a+k;

while(i

{

s[i]=*p;

p++;i++;

}

s[i]='\0';

return s;

}

void main()

{ char *t,d[13]="HighMountain";

int i=0,k=3,n=12;

while(k<6)

{ t=readstr(d,k,n/2,12);

puts(t);

free(t);

k+=2;

}

}

6、写出以下程序执行时的屏幕输出

#include

int sum(int p[],int *w,int n){

int i;

int s=0,m=0;

for(i=0;i

{

s+=p[i];

if(p[i]>m)

{

m=p[i];

*w=i;

}

}

return s;

}

void main()

{

int aa[3][3]={2,4,8,7,5,3,2,6,9},i;

int row[3],col[3]={0,0,0};

for(i=0;i<3;i++){

row[i]=sum(aa[i],col+i,3);

printf("row(%d)=%d\n",i,row[i]);

}

for(i=1;i<3;i++)

printf("第%d行位置:%d\n",i,col[i]);

}

7、写出程序的输出内容

void main( )

{

char *a[6] ={"AB","CD", "ED", "GH" "IJ" "KL"};

int i;

for(i=0;i<4;i++) printf("%s",a[i]);

printf("\n");

}

8、阅读程序,写出程序的主要功能。

void main( )

{

int i, a[10], *p=a;

for(i=0;i<10;i++) scanf("%d", p++);

for(--p; p>=a; ) printf("%d\n", *p--);

}

9、阅读下列程序,写出程序运行的输出结果。

char s[ ]= "ABCD" ;

void main( )

{

char *p;

for(p=s;p

}

10、设有下列程序,试写出运行的结果。

void main( )

{

int i,b,c,a[ ]={1,10,-3,-21,7,13},*pb,*pc;

b=c=1; pb=pc=a;

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

{

if(b<*(a+i)) { b=*(a+i); pb=&a[i]; }

if(c>*(a+i)) { c=*(a+i); pc=&a[i]; }

}

i=*a; *a= *pb; *pb=i; i= *(a+5); *(a+5) = *pc; *pc=i;

printf("%d,%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4],a[5]);

}

11、设有下列程序,当输入字符串“LEVEL”和“LEVAL”时,试写出运行的结果。#include

#include

void main( )

{

char s[81], *pi, *pj;

int n;

gets(s); n=strlen(s);

pi=s; pj=s+n-1;

while(*pi==’’) pi++;

while(*pj==’ ’) pj--;

while((pi

if(pi

else printf("YES\n");

}

12、阅读下列程序,写出程序运行的输出结果。

#include

void main( )

{

char *alpha[4] ={"ABCD","EFGH","IJKL","MNOP"};

char *p; int i;

p=alpha[0];

for(i=0;i<4;p=alpha[++i]) printf("%c",*(p));

printf("\n");

}

13、阅读下列程序,写出程序运行的输出结果。

#include

void main( )

{

int s[4][4],i,j;

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

for(j=0;j<4;j++) *(*(s+i)+j) =i-j;

for(j=0;j<4;j++)

{

for(i=0;i<4;i++) printf(″%4d″,*(*(s+i)+j)); printf("\n");

}

}

14、阅读下列程序,写出程序运行的输出结果。

#include

void main( )

{

static int a[4][4];

int *p[4],i,j;

for(i=0; i<4; i++) p[i] =&a[i][0];

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

{ *(p[i]+i)=1; *(p[i]+4-(i+1))=1; }

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

{

for(j=0;j<4;j++); printf("%2d",p[i][j]);

printf("\n");

}

}

15、阅读下列程序,写出程序运行的输出结果

#include

void main( )

{

int x=3,y=5;

void p(int *a,int b);

p(&x,y);

printf("x=%d,y=%d\n", x , y);

p(&y, x) ;

printf("x=%d,y=%d\n", x , y);

}

void p(int *a, int b)

{ *a=10; b=20;

}

16、写出下列程序的运行结果。

#include

int z;

void p(int *x,int y)

{

++*x; y--; z=*x+y;

printf("%d,%d,%d\n", *x, y, z) ;

}

void main( )

{

int x=2 , y=3 , z=4 ;

p(&x , y) ;

printf("%d,%d,%d\n", x, y, z) ;

}

四、完善题

1、下列程序通过函数调用实现两个整数值的交换。

#include

void swap( , int *p2 ){

int t;

t= ; *p1=*p2; *p2=t;

}

void main( ){

int x,y;

puts("input x,y:");

;

swap( );

printf

printf("x=%d,y=%d\n",x,y);

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

#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] = ; sptr=str;

while(*sptr) putchar(*sptr );

}

3、以下程序从输入的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", );

}

相关主题
文本预览
相关文档 最新文档