内容正文:
<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);}原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$$