C 语言程序设计单元测验六 ( 指针 ) 一 单项选择题 ( 每题 1 分, 共 54 分 ) 1 有以下程序 void fun(char *a, char *b) { a=b; (*a)++; { char c1='a',c2='a',*p1,*p2; p1=&c1; p2=&c2; fun(p1,p2); printf("%c%c\n",c1,c2); A Ab B aa C Aa D Bb 2 下列选项中正确的语句组是 ( ) A char s[8]; s={"beijing"; C char s[8]; s="beijing"; 3 已定义以下函数 fun(int *p) { return *p; 该函数的返回值是 ( ) B char *s; s={"beijing"; D char *s; s="beijing"; A 不确定的值 B 形参 p 中存放的值 C 形参 p 所指存储单元中的值 D 形参 p 的地址值 4 若有定义 :int *p[3];, 则以下叙述中正确的是 ( ) A 定义了一个类型为 int 的指针变量 p, 该变量具有三个指针 B 定义了一个指针数组 p, 该数组含有三个元素, 每个元素都是基类型为 int 的指针 C 定义了一个名为 *p 的整型数组, 该数组含有三个 int 类型元素 D 定义了一个可指向一维数组的指针变量 p, 所指一维数组应具有三个 int 类型元素 5 已定义以下函数 fun(char *p2, char *p1) { while((*p2=*p1)!='\0'){ p1++;p2++; 函数的功能是 ( ) A 将 p1 所指字符串复制到 p2 所指内存空间 C 对 p1 和 p2 两个指针所指字符串进行比较 6 有以下程序 : { int p[7]={11,13,14,15,16,17,18,i=0,k=0; while(i<7&&*(p+i)%2) {k=k+*(p+i); i++; printf("%d\n",k); 执行后输出的结果是 ( ) A 58 B 56 C 45 D 24 B 将 p1 所指字符串的地址赋给指针 p2 D 检查 p1 和 p2 两个指针所指字符串中是否有 '\0' 7 若有如下定义 char a[10],*p=a, 则对 a 数组中元素的不正确的引用是 ( ) A *&a[5] B a+2 C *(p+5) D *(a+5) 8 有以下程序 int *f(int *x,int *y) { if(*x<*y) return x; else 单元测验六第 1 页共 12 页
return y; { 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 9 有以下程序 { char *s[]={"one","two","three",*p; p=s[1]; printf("%c,%s\n",*(p+1),s[0]); 执行后输出结果是 ( ) A n,two B t,one C w,one D o,two 10 有以下程序 { int x[8]={8,7,6,5,0,0, *s; s=x+3; printf("%d\n",s[2]); 执行后输出结果是 ( ) A 随机值 B 0 C 5 D 6 11 以下函数的功能是 : 通过键盘输入数据, 为数组中的所有元素赋值 #define N 10 void arrin(int x[n]) { int i=0; while(i<n) scanf("%d", ); 在下划线处应填入的是 ( ) A x+i B &x[i+1] C x+(i++) D &x[++i] 12 有以下程序 { char *s="\n123\\"; printf("%d,%d\n",strlen(s),sizeof(s)); 执行后输出结果是 ( ) A 5,4 B 5,6 C 6,7 D 7,8 13 阅读以下函数 fun(char *sl,char *s2) { int i=0; while( sl[i]==s2[i] && s2[i]!='\0') i++; return( sl[i]=='\0' && s2[i]=='\0' ); 单元测验六第 2 页共 12 页
此函数的功能是 ( ) A 将 s2 所指字符串赋给 s1 B 比较 s1 和 s2 所指字符串的大小, 若 s1 比 s2 的大, 函数值为 1, 否则函数值为 0 C 比较 s1 和 s2 所指字符串是否相等, 若相等, 函数值为 1, 否则函数值为 0 D 比较 s1 和 s2 所指字符串的长度, 若 s1 比 s2 的长, 函数值为 1, 否则函数值为 0 14 有以下程序 { char str[ ]="xyz",*ps=str; while(*ps) ps++; for(ps--;ps-str>=0;ps--) puts(ps); 执行后输出结果是 ( ) A yz B z C z D x xyz yz yz xy xyz xyz 15 有以下程序 void fun(int *a,int i,int j) { int t; if (i<j) { t=a[i];a[i]=a[j];a[j]=t; fun(a,++i,--j); { int a[]={1,2,3,4,5,6,i; fun(a,0,5); for(i=0;i<6;i++) printf("%d",a[i]); 执行后输出结果是 ( ) A 6 5 4 3 2 1 B 4 3 2 1 5 6 C 4 5 6 1 2 3 D 1 2 3 4 5 6 16 下列程序的输出结果是 ( ) { char a[10]={9,8,7,6,5,4,3,2,1,0,*p=a+5; printf("%d",*--p); A 非法 B a[4] 的地址 C 5 D 3 17 下列程序的运行结果是 ( ) void fun(int *a, int *b) { int *k; k=a; a=b; b=k; { int a=3, b=6, *x=&a, *y=&b; fun(x,y); printf("%d %d", a, b); A 6 3 B 3 6 C 0 0 D 编译出错 单元测验六第 3 页共 12 页
18 下面程序的输出结果是 ( ) { int a[ ]={1,2,3,4,5,6,7,8,9,0,,*p; p=a; printf("%d\n",*p+9); A 0 B 1 C 10 D 9 19 以下程序的输出结果是 ( ) { int i, x[3][3]={1,2,3,4,5,6,7,8,9; for(i=0;i<3;i++) printf("%d,",x[i][2-i]); A 1,5,9 B 1,4,7 C 3,5,7 D 3,6,9 20 以下程序的输出结果是 ( ) { int a[3][3]={ {1,2,{3,4,{5,6,i,j,s=0; for(i=1;i<3;i++) for(j=0;j<=i;j++) s+=a[i][j]; printf("%d\n",s); A 18 B 19 C 20 D 21 21 若有说明 :int i, j=2,*p=&i;, 则能完成 i=j 赋值功能的语句是 ( ) A i = *p; B *p = *&j; C i = &j; D i = **p; 22 以下定义语句中, 错误的是 ( ) A int a[]={1,2; B char *a[3]; C char s[10]="test"; D int n=5,a[n]; 23 以下程序的输出结果是 ( ) char cchar(char ch) { if(ch>='a'&&ch<='z') ch=ch-'a'+'a'; return ch; { char s[]="abc+abc=defdef",*p=s; while(*p) { *p=cchar(*p); p++; printf("%s\n",s); A abc+abc=defdef B abc+abc=defdef C abcaabcdefdef D abcabcdefdef 24 以下程序段的输出结果是 ( ) char s[]="\\141\141abc\t"; printf ("%d\n",strlen(s)); A 8 B 9 C 12 D 13 单元测验六第 4 页共 12 页
25 以下程序调用 findmax 函数返回数组中的最大值 findmax(int *a,int n) { int *p,*s; for(p=a,s=a; p-a<n; p++) if ( ) s=p; return(*s); { int x[5]={12,21,13,6,18; printf("%d\n",findmax(x,5)); 在下划线处应填入的是 ( ) A p>s B *p>*s C a[p]>a[s] D p-a>p-s 26 以下程序的输出结果是 ( ) { char cf[3][5]={"aaaa","bbb","cc"; printf("\"%s\"\n",ch[1]); A "AAAA" B "BBB" C "BBBCC" D "CC" 27 以下不能正确进行字符串赋初值的语句是 ( ) A char str[5]="good!"; C char *str="good!"; 28 以下程序的输出结果是 ( ) f(int *b, int m, int n) { int i,s=0; for(i=m;i<n;i=i+2) s=s+*(b+i); return s; { int x,a[]={1,2,3,4,5,6,7,8,9; x=f(a,3,7); printf("%d\n",x); A 10 B 18 C 8 D 15 29 以下程序的输出结果是 ( ) #include <string.h> { char b1[8]="abcdefg",b2[8],*pb=b1+3; while (--pb>=b1) strcpy(b2,pb); printf("%d\n",strlen(b2)); A 8 B 3 C 1 D 7 B char str[]="good!"; D char str[5]={'g','o','o','d'; 30 若有说明 :int n=2,*p=&n,*q=p;, 则以下非法的赋值语句是 ( ) A p=q; B *p=*q; C n=*q; D p=n; 31 有以下程序 单元测验六第 5 页共 12 页
void fun(char *c,intd) { *c=*c+1;d=d+1; printf("%c,%c,",*c,d); { 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 32 以下程序中函数 sort 的功能是对 a 所指数组中的数据进行由大到小的排序, void sort(int a[],int n) { int i,j,t; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]<a[j]) { t=a[i];a[i]=a[j];a[j]=t; { int aa[10]={1,2,3,4,5,6,7,8,9,10,i; sort(&aa[3],5); for(i=0;i<10;i++) printf("%d,",aa[i]); printf("\n"); A 1,2,3,4,5,6,7,8,9,10, B 10,9,8,7,6,5,4,3,2,1, C 1,2,3,8,7,6,5,4,9,10, D 1,2,10,9,8,7,6,5,4,3, 33 有以下程序 { char a[]={'a','b','c','d','e','f','g','h','\0'; int i,j; i=sizeof(a); j=strlen(a); printf("%d,%d\n",i,j); A 9,9 B 8,9 C 1,8 D 9,8 34 以下程序中的函数 reverse 的功能是将 a 所指数组中的内容进行逆置 void reverse(int a[],int n) { int i,t; for(i=0;i<n/2;i++) { t=a[i];a[i]=a[n-1-i];a[n-1-i]=t; { int b[10]={1,2,3,4,5,6,7,8,9,10; int i,s=0; reverse(b,8); for(i=6;i<10;i++) s+=b[i]; printf("%d\n",s); 单元测验六第 6 页共 12 页
A 22 B 10 C 34 D 30 35 有以下程序 { int aa[4][4]={{1,2,3,4,{5,6,7,8,{3,9,10,2,{4,2,9,6; int i,s=0; for(i=0;i<4;i++) s+=aa[i][1]; printf("%d\n",s); A 11 B 19 C 13 D 20 36 有以下程序 #include <string.h> { char *p="abcde\0fghjik\0"; printf("%d\n",strlen(p)); A 12 B 15 C 6 D 5 37 有以下程序 void ss(char *s,char t) { while(*s) { if(*s==t) *s=t-'a'+'a'; s++; { char str1[100]="abcddfefdbd",c='d'; ss(str1, c); printf("%s\n",str1); A ABCDDEFEDBD B abcddfefdbd C abcaafefaba D Abcddfefdbd 38. 变量的指针, 其含义是指该变量的 ( ) A 值 B 地址 C 名 D 一个标志 39. 若有语句 int *point,a=4; 和 point=&a; 下面均代表地址的一组选项是 ( ) A a,point,*&a C *&point,*point,&a B &*a,&a,*point D &a,&*point,point 40. 若有说明 ;int *p,m=5,n; 以下正确的程序段的是 ( ) A p=&n; B p=&n; C scanf("%d",&n); D p=&n; scanf("%d",&p); scanf("%d",*p); *p=n; *p=m; 41. 下面程序段的运行结果是 ( ) char *s="abcde"; s+=2;printf("%d",s); A cde B 字符 'c' C 字符 'c' 的地址 D 无确定的输出结果 42. 设 p1 和 p2 是指向同一个字符串的指针变量,c 为字符变量, 则以下不能正确 单元测验六第 7 页共 12 页
执行的赋值语句是 ( ) A c=*p1+*p2; B p2=c C p1=p2 D c=*p1*(*p2); 43. 以下正确的程序段是 ( ) A char str[20]; B char *p; C char str[20]; D char str[20],*p=str; scanf("%s", str); scanf("%s",p); scanf("%s",&str[2]); scanf("%s",p[2]); 44. 若有说明语句 char a[]="it is mine"; char *p="it is mine"; 则以下不正确的叙述是 ( ) A a+1 表示的是字符 t 的地址 B p 指向另外的字符串时, 字符串的长度不受限制 C p 变量中存放的地址值可以改变 D a 中只能存放 10 个字符 45. 下面程序的运行结果是 ( ) #include <string.h> { char *s1="abdeg"; char *s2="abdeg"; s1+=2;s2+=2; printf("%d\n",strcmp(s1,s2)); A 正数 B 负数 C 零 D 不确定的值 46. 下面程序的运行结果是 ( ) #include <string.h> fun(char *w,int n) {char t,*s1,*s2; s1=w;s2=w+n-1; while(s1<s2){t=*s1++;*s1=*s2--;*s2=t; {char *p; p="1234567"; fun(p,strlen(p)); puts(p); A 7654321 B 1714171 C 1711717 D 7177171 47. 若有以下定义, 则对 a 数组元素的正确引用是 ( ) int a[5],*p=a; A *&a[5] B a+2 C *(p+5) D *(a+2) 48. 若有定义 :int a[2][3], 则对 a 数组的第 i 行 j 列元素地址的正确引用为 ( ) A *(a[i]+j) B (a+i) C *(a+j) D a[i]+j 49. 若有以下定义, 则 p+5 表示 ( ) int a[10],*p=a; 单元测验六第 8 页共 12 页
A 元素 a[5] 的地址 B 元素 a[5] 的值 C 元素 a[6] 的地址 D 元素 a[6] 的值 50. 以下程序的输出结果是 ( ) void fun(int x); { int x = 3; fun(x); printf( x = %d\n, x); void fun(int x){ x = 5; A 3 B 5 C 8 D 2 51. 以下程序的输出结果是 ( ) void fun(int *p); { int x = 3; fun(&x); printf( x = %d\n, x); void fun(int *p){ *p = 5; A 3 B 5 C 8 D 2 52. 下列程序的输出结果是 ( ) {int **k,*a,b=100;a=&b; k=&a;printf( %d\n,**k); A 运行出错 B 100 C a 的地址 D b 的地址 53. 下列程序的输出结果是 ( ) fun(int *a,int *b) {int *w;*a=*a+*a;*w=*a; *a=*b; *b=*w; {int x=9,y=5,*px=&x,*py=&y;fun(px,py);printf( %d, %d\n,x,y); A 出错 B 18, 5 C 5, 9 D 5, 18 54. 若定义了以下函数 : void f( ) { p=(double *)malloc(10*sizeof(double)); p 是该函数的形参, 要求通过 p 把动态分配存储单元的地址传回主调函数, 则形参 p 的正确定义应当 是 ( ) A double *p B float **p C double **p D float *p 二 判断题 ( 正确的在括号内打, 错误的在括号内打, 每题 1 分, 共 35 分 ) 单元测验六第 9 页共 12 页
( )1. 指针变量里存放的是地址值, 因此指针变量只能是 int 型的 ( )2. 在 C 语言中, 所谓指针型数据, 即指该数据是一个地址 ( )3. 有一个一维数组 a[10], 那么 a 与 &a[0] 等价 ( )4. 如有说明 :int b[10], *p = b; 表明在使用时 b 与 p 就完全等价了 ( )5. 数组中的每一个元素相当于一个变量 若要让一个指针变量指向它, 必须用 & 数组元素 的方法向该指针变量赋值 ( )6. 有如下程序段 :int i, j = 2, k, *p = &i;k = *p + j; 这里出现的两个 * 号, 含义是一样的 ( )7. 在 C 语言中, 每一个变量在内存里占用的单元数都是相同的 ( )8. 通过指针变量, 就能间接地得到它所指向的变量的内容 ( )9. 说明语句 :int *p, p1, p2; 只说明了一个能指向 int 型变量的指针 ( )10. 有说明 :int *p; 且 p 指向地址为 1500 的内存单元, 那么经过操作 p++; 后,p 将指向 1501 的内存单元 ( )11. 数组元素可以是不同数据类型的 ( )12. 如果初值表中的初值个数少于数组长度, 那么 C 语言编译程序会自动把剩余的元素初始化为初值表中的最后一个值 ( )13. 主调函数把单个数组元素传递给修改该元素值的被调函数时, 主调函数就能够得到修改后的值 ( )14. 设 p 是指向数组 a 的指针变量, 则 a[i] 和 p[i] 等价 ( )15. 一个变量的指针就是该变量的地址 ( )16. 若定义 int **p; 则程序中调用 *p 时, 它代表的是 p 的地址 ( )17. 若指针占用的内存大小为 2Byte, 则指向它的二重指针占用内存大小为 4Byte. ( )18. 带参 main 函数中的形参的值可以在程序中得到 ( )19.main(argc,argv) 中的参数 argv 的定义格式为 char argv[] ( )20.int **p; 表示定义一个 *p 指针变量 ( )21. 在 C 语言中允许将一个整数赋给指针变量 ( )22. 一个指针变量加 1 表示将该指针变量的原值 ( 地址 ) 加 1 ( )23.int *p(); 表示定义一个指向函数的指针变量 p ( )24. 当函数实参中使用指针变量时, 形参变量也必须使用指针变量 ( )25.*p++ 等价于 (*p)++ 单元测验六第 10 页共 12 页
( )26. 使用指针技术, 可以通过修改形参变量的值达到修改实参变量的值的目的 ( )27. 因为用字符数组和字符指针变量都能实现字符串的存储和运算, 因此它们二者是完全等价 的 ( )28. 对指向函数的指针变量, 像 p+n p++ p- - 等运算是无意义的 ( )29.main(int argc,char *argv[]) 中的参数 argc 表示命令行只参数的个数 ( )30. 在 int a[3][4]; 中 a+i 和 *(a+i) 的含义是不一样的 ( )31.char *p[10]; 定义了一个指向字符数组的指针变量 ( )32. 将指向函数的指针作为函数的参数, 虽然可以提高效率, 但是容易造成混乱, 所以不符合 结构化程序设计的原则 ( )33. 数组名实际上是此数组的首地址, 所以数组名相当于一个指针变量 ( )34. 若定义数组 a[2][3], 则 a+1 和 *(a+1) 完全等价 ( )35. 函数的形参为一个数组, 则调用此函数时将数组名作为对应的实参 四 程序填空题 ( 每题 2 分, 共 6 分 ) 1. 以下 count 函数的功能是统计 substr 在母串 str 中出现的次数 int count(char *str,char *substr) { int i,j,k,num=0; for(i=0; {for( ;i++) if(substr[ ]== \0 ) {num++;break; return num;,k=0;substr[k]==str[j];k++,j++) 2. 以下 Delblank 函数的功能是删除字符串 s 中的所有空格 ( 包括 Tab 回车符和换行符 ) void Delblank(char *s) { int i,t; char c[80]; for(i=0,t=0; if(!isspace( c[t]= \0 ; strcpy(s,c); ;i++) ))c[t++]=s[i]; 3. 以下 conj 函数的功能是将两个字符串 s 和 t 连接起来 char *conj(char *s,char *t) { char *p=s; while(*s) ; while(*t) {*s= *s= \0 ; ;s++;t++; 单元测验六第 11 页共 12 页
; 五 (5 分 ) 编写函数 void fun(float x,float y,float *result1, float *result2), 其功能为 : 计算两个浮点数 x 和 y 的平方和 平方差, 其计算结果分别通过指针变量 result1 和 result2 返回 单元测验六第 12 页共 12 页