第九章 指针《C语言程序设计教程》(清华大学出版社第三版) 章节关过卷

2025-07-08
| 2份
| 16页
| 87人阅读
| 1人下载

内容正文:

<C语言程序设计教程>清华大学出版社(第3版) 第九章 指针 章节过关卷 考试时间:90分钟 满分:100分 姓名 班级 学号 1、 选择题(共10题,每小题2分,共20分) 1、 若有如下定义,以下写法中错误的是 。 int a[5][6],*b; A、 B、 b=a; C、 b=a[0]; D、 b=&a[0][0]; E、 b=*a; 【答案】A 【解析】b为列指针,而指向的a数组是二维数组,类型不匹配。故选A。 2、 若有定义char b[6][9];以下行指针定义正确的是 。 A、 B、 char *p[9]; C、 char (*p)[6]; D、 char (*p)[9]; D、char (*p[9]) 【答案】C 【解析】行指针定义格式:数据类型符 (*行指针名)[常量表达式];常量表达中是指向数组的第二维大小。故选C。 3、 若有定义如下,则输出结果不能为3的是 。 char nn[][4]={“1234”,”6345”,”6513”},*p=(char *)nn; A、 *(p+2) B、*(p+1*6) C、*(*(nn+2)+0) D、nn[0]+2 【答案】D 【解析】D选项为nn[0][2]元素的地址。故选D。 4、 若有如下语句,下列说法中正确的是 。 void main(int arge,char *argv[]) 输入命令行为:file xiaoxue chuzhong gaozhong<回车> A、 main函数中参数arge表示命令行参数的数量,不包括命令名本身,因此题干中arge=3。 B、 命令行传递的参数从argv[0]开始。 C、 argv[1]指向第一个参数xiaoxue。 D、 我们可以通过修改arge的值,来增加命令行。 【答案】C原创精品资源学科网独家享有版权,侵权必究! 【解析】A选项中,main函数中参数arge表示命令行参数的数量,包括程序名本身,因此题干中arge=4;B选项,命令行传递的参数从argv[1]开始,argv[0]存放的是命令名; D选项,arge和argv是main函数参数,由系统传递。故选C。 5、 若有函数int sum(int x,int y),则下列函数指针p定义正确的是 。 A、 B、 int(p *)(int,int); C、 int(*p)(int,int); D、 int(*p)(); E、 int(p)(int x,int y); 【答案】B 【解析】函数指针定义格式为:函数类型(*指针名)([形参类型1,形参类型2...])。函数指针类型跟着所指向函数类型走。故选B。 6、 若有一下定义,则说法正确的是 。 char *s[4]={“huanghe”,”changjiang”,”liuyu”,”gaoyuan”},**q; q=s+1; A、 s[0]中存放字符串”huanghe”。 B、 s数组中每个元素都是指针,分别指向字符串的首地址。 C、 若用%c输出*q,则输出c。 D、 若用%s输出*q++,则输出字符串”liuyu”。 【答案】B 【解析】A选项,s[0]中存放字符串”huanghe”的首地址;C选项,%c输出**q的值才为c;用%s输出*q++,输出字符串”changjiang”。故选B。 7、 若有语句如下,则输出结果是 。 char *str="12\0abh\018"; printf("%d,%d",strlen(str),sizeof(str)); A、8,9 B、9,8 C、2,4 D、4,2 【答案】C 【解析】strlen返回字符串长度,遇到’\0’结束,str是指针占4个字节。故选C。 8、 若有定义如下,则对数组元素地址引用正确的是 。 int b[10],*q=b; A、 B、 &b[1] C、 q+10 D、 *(q+2) E、 &b+1 【答案】A 【解析】B选项越界,C选项是取b[2]的值,D选项&b是b数组的行指针,&b+1指向b[9]下一个地址。故选A。原创精品资源学科网独家享有版权,侵权必究! 9、 若有定义如下,则输出结果是 。 int a[3][2]={5,6,8,4,2,7},(*p)[2],i; p=a; for(i=0;i<3;i++) printf("%d,",*(p+i)+1); A、6,4,7, B、5,8,2, C、5,6,8 D、以上均不正确 【答案】D 【解析】输出的是a[0][1]、a[1][1]、a[2][1]的地址,故选D。 10、 若有定义如下,则输出结果是 。 static int b[6]={5,6,1,2,7,3},*p; p=(int *)(&b+1); printf("%d,%d",*b+2,*(p-3)+1); A、7,3 B、1,2 C、7,7 D、以上均不正确 【答案】A 【解析】*b+2先取*b的值为5,在加2,因此*b+2值为7。p指向b[5]的地址,p-3后指向b[3]的地址,取得b[3]得值2加1,因此*(p-3)+1为3。故选A。 二、填空题(共6空,每空2分,共12分) 1、分配m个连续的整型内存单元,并将首地址赋值给p,请写出C语句 。 【答案】p=(int *)malloc(n*sizeof(int));或 p=(int *)calloc(n,sizeof(int)); 2、 若有定义int a[5][10], (*p)[10];且p指针指向a数组。任写两种通过行指针p引用数组元素a[3][5]的方法: 和 。 【答案】p[3][5] *(p[3]+5) *(*(p+3)+5) (*(p+i))[j](任写两种) 3、 对于基类型相同的两个指针变量间,不能进行的运算是 。 【答案】加法运算(没有意义) 4、 语句int (*p)[20]与int *p[20];的区别是 。 【答案】前者是二维数组行指针,p是指针变量。后者是指针数组,p是数组名 5、 若有语句char *pstr;pstr=”abcdef”;则指针变量pstr中存放的是 。 【答案】字符串常量的首地址原创精品资源学科网独家享有版权,侵权必究! 三、程序运行题(共6题,每小题3分,共18分) 1、以下程序的运行结果是 。 #include<stdio.h> void main() { int a[10]={5,6,8,9,11,23,45,4,2,16},*p,*b; b=a+3; p=(int *)(&a+1); printf("b=%d,%d,p=%d ",b[-2],b[2],*(p-3));} 【答案】b=6,23,p=4 2、以下程序的运行结果是 。 #include<stdio.h> void main() { int b[6]={2,4,6,8,10,12},*p; int s=0,i; p=b+2; for(i=0;i<=2;i++) s+=*++p+i; printf("s=%d",s); } 【答案】s=33 3、以下程序的运行结果是 。 #include<stdio.h> void main() { char b[3][10]={"1244","abcd","efgh"},*p,(*q)[10]; p=b[0]; q=b+2; printf("%c,%c ",(*p)++,*++p); printf("%c,%s ",*p++,p); printf("%s,%c ",q,++*q[0]); } 【答案】2,2原创精品资源学科网独家享有版权,侵权必究! 3,344 ffgh,f 4、以下程序的运行结果是 。 #include<stdio.h> void main() {int a[5]={6,3,5,9,8},*b,**p; b=a,p=&b; printf("%d,%d ",*b++,*(b+1)+1); printf("%d ",**p); } 【答案】6,4 3 5、以下程序的运行结果是 。 #include<stdio.h> #include<st> void main(int arge,char *argv[]) { char *s=argv+2; if(arge<3) return 0; printf(“%s,*c”,s,*s++); printf(“%s”,*(argv+1));} 从命令行输入:file ab124 56sct<回车> 【答案】56sct,5 ab124 6、以下程序的运行结果是 。 #include<stdio.h> int add(int *a,int n) { int i,s=0; for(i=0;i<n;i++) s=s+a[i]; return s; } void main() { static int a[3][4]={5,3,4,1,2,7,5,6,9,5,6,8};原创精品资源学科网独家享有版权,侵权必究! int *p,t1,t2; int (*q)(int *,int); q=add; p=a[0]; t1=add(p,12); t2=(*q)(p,12); printf("t1=%d,t2=%d ",t1,t2); } 【答案】t1=61,t2=61 四、程序填空题(共6空,每空5分,共30分) 1、程序功能:将数组中后n个整数移到最前面,而前面的数顺序向后移动。如有1,2,3,4,5,6,7,8,9,10将最后的4个数移动到数组前面后,为7,8,9,10,1,2,3,4,5,6。请填空。 #include<stdio.h> #define N 10 void mov(int *a,int m) { int t,i,j; for(i=1;i<=m;i++) { for( ;j>=0;j--) *(a+j+1)=*(a+j); *(a+0)=t; } } void main() {int a[N],n,*p; scanf("%d",&n); for(p=a;p<a+N;p++) scanf("%d",p); for(p=a;p<a+N;p++) printf("%d",*p); } 【答案】t=*(a+N-1); j=N-2 mov(a,n); 原创精品资源学科网独家享有版权,侵权必究! 2、 程序功能:判断从键盘输入的数据(不超过100)是否为回文数(从左往右读和从右往左读都一样)。例如输入:4334 输出:YES;输入:abdcd输出:NO。请填空。 #include<stdio.h> #include<string.h> int hws(char *s) { int f=1; char *ps=s,*pe; ; while( ) { if(*ps! =*pe) { return f; } ps++; pe--; } return f; } int main(void) { char a[100]; int r; scanf(“%s”,a); r=hws(a); if( r ) printf(“YES”); else printf(“NO”); return0; } 【答案】pe=ps+strlen(s)-1 ps< pe f=0 五、程序改错题(共20分) 1、程序功能:动态数组存放n个学生成绩,同时输出优秀的成绩。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分) L1 #include<stdio.h> L2 #include<stdlib.h> L3 #include<malloc.h>原创精品资源学科网独家享有版权,侵权必究! L4 #define N 20 L5 void cj(flaot *b,int n) L6 { float *q; L7 for(q=b;q<b+n;q++) L8 if(*q>80) printf("%f",*q); } L9 void main() L10 { float *p; L11 int i; L12 p=(float )malloc(sizeof(float)*N); L13 if(p==NULL){exit(0);} L14 for(i=0;i<N;i++) scanf("%f",&(p+i)); L15 cj(p,N); L16 free(p); } 【答案】L12 p=(float *)malloc(sizeof(float)*N); L14 for(i=0;i<N;i++) scanf("%f",p+i); 2、程序功能:函数insert(char s1[ ],char s2[ ],int n)实现在字符串str1中的第n个字符后插入字符串str2,如下程序的输出为:123abc45 L1 #include<stdio.h> L2 void insert(char s1[ ],char s2[ ],int n) L3 { char*p,*q; L4 int i=0; L5 p=str1; L6 for(i=0;i<n;i++) p++; L7 while(*s2!='\0') L8 { q=p; L9 while(*q!='\0') q++; L10 while(q>p) L11 { *(q+1)=*q; q--; } L13 q++; L14 q=s2;原创精品资源学科网独家享有版权,侵权必究! L15 s2++; L16 p++; } } L7 void main( ) L18 { char a[10]="12345"; L19 char b[5]="abc"; L20 insert(a,b,3); L21 printf("%s",a);} 【答案】L10 while(q>=p) L14 *q=*s2;原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $$ <C语言程序设计教程>清华大学出版社(第3版) 第九章 指针 章节过关卷 考试时间:90分钟 满分:100分 姓名 班级 学号 1、 选择题(共10题,每小题2分,共20分) 1、 若有如下定义,以下写法中错误的是 。 int a[5][6],*b; A、 B、 b=a; C、 b=a[0]; D、 b=&a[0][0]; E、 b=* 2、 若有定义char b[6][9];以下行指针定义正确的是 。 A、 B、 char *p[9]; C、 char (*p)[6]; D、 char (*p)[9]; D、char (*p[9]) 3、 若有定义如下,则输出结果不能为3的是 。 char nn[][4]={“1234”,”6345”,”6513”},*p=(char *)nn; A、 *(p+2) B、*(p+1*6) C、*(*(nn+2)+0) D、nn[0]+2 4、 若有如下语句,下列说法中正确的是 。 void main(int arge,char *argv[]) 输入命令行为:file xiaoxue chuzhong gaozhong<回车> A、 main函数中参数arge表示命令行参数的数量,不包括命令名本身,因此题干中arge=3。 B、 命令行传递的参数从argv[0]开始。 C、 argv[1]指向第一个参数xiaoxue。 D、 我们可以通过修改arge的值,来增加命令行。 5、 若有函数int sum(int x,int y),则下列函数指针p定义正确的是 。 A、 B、 int(p *)(int,int); C、 int(*p)(int,int); D、 int(*p)(); E、 int(p)(int x,int y); 6、 若有一下定义,则说法正确的是 。 char *s[4]={“huanghe”,”changjiang”,”liuyu”,”gaoyuan”},**q; q=s+1; A、 s[0]中存放字符串”huanghe”。原创精品资源学科网独家享有版权,侵权必究! B、 s数组中每个元素都是指针,分别指向字符串的首地址。 C、 若用%c输出*q,则输出c。 D、 若用%s输出*q++,则输出字符串”liuyu”。 7、 若有语句如下,则输出结果是 。 char *str="12\0abh\018"; printf("%d,%d",strlen(str),sizeof(str)); A、8,9 B、9,8 C、2,4 D、4,2 8、 若有定义如下,则对数组元素地址引用正确的是 。 int b[10],*q=b; A、 B、 &b[1] C、 q+10 D、 *(q+2) E、 &b+1 9、 若有定义如下,则输出结果是 。 int a[3][2]={5,6,8,4,2,7},(*p)[2],i; p=a; for(i=0;i<3;i++) printf("%d,",*(p+i)+1); A、6,4,7, B、5,8,2, C、5,6,8 D、以上均不正确 10、 若有定义如下,则输出结果是 。 static int b[6]={5,6,1,2,7,3},*p; p=(int *)(&b+1); printf("%d,%d",*b+2,*(p-3)+1); A、7,3 B、1,2 C、7,7 D、以上均不正确 二、填空题(共6空,每空2分,共12分) 1、分配m个连续的整型内存单元,并将首地址赋值给p,请写出C语句 。 2、 若有定义int a[5][10], (*p)[10];且p指针指向a数组。任写两种通过行指针p引用数组元素a[3][5]的方法: 和 。 3、 对于基类型相同的两个指针变量间,不能进行的运算是 。 4、 语句int (*p)[20]与int *p[20];的区别是 。 5、 若有语句char *pstr;pstr=”abcdef”;则指针变量pstr中存放的是 。 三、程序运行题(共6题,每小题3分,共18分) 原创精品资源学科网独家享有版权,侵权必究! 1、以下程序的运行结果是 。 #include<stdio.h> void main() { int a[10]={5,6,8,9,11,23,45,4,2,16},*p,*b; b=a+3; p=(int *)(&a+1); printf("b=%d,%d,p=%d ",b[-2],b[2],*(p-3));} 2、以下程序的运行结果是 。 #include<stdio.h> void main() { int b[6]={2,4,6,8,10,12},*p; int s=0,i; p=b+2; for(i=0;i<=2;i++) s+=*++p+i; printf("s=%d",s); } 3、以下程序的运行结果是 。 #include<stdio.h> void main() { char b[3][10]={"1244","abcd","efgh"},*p,(*q)[10]; p=b[0]; q=b+2; printf("%c,%c ",(*p)++,*++p); printf("%c,%s ",*p++,p); printf("%s,%c ",q,++*q[0]); } 4、以下程序的运行结果是 。 #include<stdio.h> void main() {int a[5]={6,3,5,9,8},*b,**p;原创精品资源学科网独家享有版权,侵权必究! b=a,p=&b; printf("%d,%d ",*b++,*(b+1)+1); printf("%d ",**p); } 5、以下程序的运行结果是 。 #include<stdio.h> #include<st> void main(int arge,char *argv[]) { char *s=argv+2; if(arge<3) return 0; printf(“%s,*c”,s,*s++); printf(“%s”,*(argv+1));} 从命令行输入:file ab124 56sct<回车> 6、以下程序的运行结果是 。 #include<stdio.h> int add(int *a,int n) { int i,s=0; for(i=0;i<n;i++) s=s+a[i]; return s; } void main() { static int a[3][4]={5,3,4,1,2,7,5,6,9,5,6,8}; int *p,t1,t2; int (*q)(int *,int); q=add; p=a[0]; t1=add(p,12); t2=(*q)(p,12); printf("t1=%d,t2=%d ",t1,t2); } 四、程序填空题(共6空,每空5分,共30分) 1、程序功能:将数组中后n个整数移到最前面,而前面的数顺序向后移动。如有1,2,3,4,5,6,7,8,9,10将最后的4个数移动到数组前面后,为7,8,9,10,1,2,3,4,5,6。请填空。原创精品资源学科网独家享有版权,侵权必究! #include<stdio.h> #define N 10 void mov(int *a,int m) { int t,i,j; for(i=1;i<=m;i++) { for( ;j>=0;j--) *(a+j+1)=*(a+j); *(a+0)=t; } } void main() {int a[N],n,*p; scanf("%d",&n); for(p=a;p<a+N;p++) scanf("%d",p); for(p=a;p<a+N;p++) printf("%d",*p); } 2、 程序功能:判断从键盘输入的数据(不超过100)是否为回文数(从左往右读和从右往左读都一样)。例如输入:4334 输出:YES;输入:abdcd输出:NO。请填空。 #include<stdio.h> #include<string.h> int hws(char *s) { int f=1; char *ps=s,*pe; ; while( ) { if(*ps! =*pe) { return f; }原创精品资源学科网独家享有版权,侵权必究! ps++; pe--; } return f; } int main(void) { char a[100]; int r; scanf(“%s”,a); r=hws(a); if( r ) printf(“YES”); else printf(“NO”); return0; } 五、程序改错题(共20分) 1、程序功能:动态数组存放n个学生成绩,同时输出优秀的成绩。请在找出错误语句,并写出完整的正确语句。(找出错误2分,改正错误3分) L1 #include<stdio.h> L2 #include<stdlib.h> L3 #include<malloc.h> L4 #define N 20 L5 void cj(flaot *b,int n) L6 { float *q; L7 for(q=b;q<b+n;q++) L8 if(*q>80) printf("%f",*q); } L9 void main() L10 { float *p; L11 int i; L12 p=(float )malloc(sizeof(float)*N); L13 if(p==NULL){exit(0);} L14 for(i=0;i<N;i++) scanf("%f",&(p+i)); L15 cj(p,N); L16 free(p); } 2、程序功能:函数insert(char s1[ ],char s2[ ],int n)实现在字符串str1中的第n个字符后插入字符串str2,如下程序的输出为:123abc45原创精品资源学科网独家享有版权,侵权必究! L1 #include<stdio.h> L2 void insert(char s1[ ],char s2[ ],int n) L3 { char*p,*q; L4 int i=0; L5 p=str1; L6 for(i=0;i<n;i++) p++; L7 while(*s2!='\0') L8 { q=p; L9 while(*q!='\0') q++; L10 while(q>p) L11 { *(q+1)=*q; q--; } L13 q++; L14 q=s2; L15 s2++; L16 p++; } } L7 void main( ) L18 { char a[10]="12345"; L19 char b[5]="abc"; L20 insert(a,b,3); L21 printf("%s",a);}原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $$

资源预览图

第九章 指针《C语言程序设计教程》(清华大学出版社第三版) 章节关过卷
1
第九章 指针《C语言程序设计教程》(清华大学出版社第三版) 章节关过卷
2
第九章 指针《C语言程序设计教程》(清华大学出版社第三版) 章节关过卷
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。