《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", ); }