国家二级C语言机试(编译预处理和指针)模拟试卷7
国家二级C语言机试(编译预处理和指针)模拟试卷7
(总分:56.00,做题时间:90分钟)
一、选择题(总题数:28,分数:56.00)
1.有以下程序:#include<stdio.h>void main() void fun(char*c) {char s[81];{while(*c) gets(s);fun(s);puts(s); {if(*c>='a'&&*c<='z')*c=*c-('a'-'A'); } c++: }} 当执行程序时从键盘上输入Hello Beijing<回车>,则程序的输出结果是
(分数:2.00)
A.HELLO BEIJING √
B.Hello Beijing
C.hello Beijing
D.hELLO Beijing
解析:解析:子函数fun的功能是把小写字母转换成大写字母,所以程序的输出结果为选项A)。
2.有以下程序#include<stdio.h>void f(int*p,int*q) void f(int*p,int*q);{ main() p==p+1;*q=*q+1; { int m=1,n=2,*r=&m; } f(r,&n);printf("%d,%d",m,n); }程序运行后的输出结果是
(分数:2.00)
A.2,3
B.1,3 √
C.1,4
D.1,2
解析:解析:本题考查函数的调用与指针。fun()函数的作用是:使指针p指向原来所指变量的下一个变量,使q指针指向的值加1。主函数中,指针r指向m,调用fun()函数的结果是,使r指向地址位于m后面的变量,使位丁n的地址上的变量(就是n)的值加1,因此,结果为1,3。
3.有以下程序 #include<stdio.h> main() void fun(int*a,int*b) { int x=3,y=5,*p=&x,*q=&y;{ int*c;fun(p,q);printf("%d,%d,",*p,*q);c=a;a=b;b=c;} fun(&x,&y);printf("%d,%d\n",*p,*q);}程序运行后的输出结果是
(分数:2.00)
A.3,5,5,3
B.3,5,3,5 √
C.5,3,3,5
D.5,3,5,3
解析:解析:本题考查函数的调用与指针。p和q分别为指向x和y的指针,函数fun()的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能返回主函数。而主函数中,fun(p,q)、fun(&x,&y)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。
4.有下列程序:void f(int b[]) {int I;for(i=2;i<6;i++)b[i]*=2;} main() {int a[10]={1,2,3,4,5,6,7,8,9,10},i;f(a);for(i=0;i<10,i++)printf("%d,",a[i]);}程序运行后的输出结果是
(分数:2.00)
A.1,2,3,4,5,6,7,8,9,10,
B.1,2,3,4,10,12,14,16,9,10,
C.1,2,6,8,10,12,7,8,9,10,√
D.1,2,6,8,10,12,14,16,9,10,
解析:解析:函数void f(int b[])的功能是对数组b[]中第2个到第5个元素的值逐个扩大2倍。所以在main()函数中,f(a)语句的作用是对数组a[10]中从a[2]到a[5]的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,9,10}。
5.有以下程序 #include<stdio.h> int fun(char s[]) main() {int n==0; {char s[10]={'6','1','*','4','*','9','*','0','*'};while(*s<='9'&&*s>='0') printf("%d\n",fun(s));{n=10*n+*s
-'0';s++;} } return(n);}程序的运行结果是
(分数:2.00)
A.61490
B.61 √
C.9
D.5
解析:解析:在fun函数中,while循环的功能是逐个取字符数组s的字符判断其是否是数字。若是则将这些数字组成一个数保存到变量n中,并返回变量n的值。所以在主函数中调用fun(s)时,将把字符数组s中的数字组成一个数输出。因为当指针s指向数组的第3位时,即字符'*',循环条件不成立,循环结束,返回n的值。所以输出n的值为61。
6.若有以下程序 #include<stdio.h> void sp(int*a){ int b=2; main(){int k=3,*p=&k; a=&b;sp(p); *a=*a*2; printf("%d,%d\n",k,*p); printf("%d,",*a);} }则程序的输出结果是(分数:2.00)
A.4,3,4
B.4,3,3 √
C.6,3,6
D.6,6,6
解析:解析:主函数中定义指针变量p指向k,调用函数sp(p),将k的地址传递给形参指针a,函数转到sp运行,a指向b的地址,表达式*a=*a*2,相当于b=b*2,得到*a的数据4输出。函数调用结束,此时a 和b的空间撤销,而对实参k和p的值并没有改变,仍旧是3。
7.若有以下程序 #include<stdio.h> int k=7: void f(int**s){int*t=&k; *s=t:printf("%d,%d,%d,",k,*t,**s);} main(){int i=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*p,**r);}则程序的输出结果是
(分数:2.00)
A.3,7,7,7,7,7
B.7,7,7,3,3,3
C.3,3,3,7,7,7
D.7,7,7,3,7,7 √
解析:解析:本题考查了二级指针,二级指针可以保存一级指针的地址。主函数中p指向i,r指向p,函数调用后s指向p,在f函数中t指向全局变量k=7,s指向t,同时s保存了实参p的地址,此时p也指向t,输出三个7,流程转到主函数,i的值为3,p以及r的值为7。
8.若有以下程序#include<stdio.h>int*f(int*s,int*t){int*k;if(*s<*t){ k=s;s=t;t=k;} return s;} main(){ int i=3,j=5,*p=&i,*q=&j,*r;r=f(p,q);printf("%d,%d,%d,%d,%d\n",i,j,*P,*q,*r);}则程序的输出结果是
(分数:2.00)
A.3,5,5,3,5
B.5,3,5,3,5
C.5,3,3,5,5
D.3,5,3,5,5 √
解析:解析:本题考查了返回值为指针的函数,函数f的主要功能为第一个参数小于第二个参数,那么交换指针的指向,这对于实参指向的数据时没有影响的。最后返回比较大的元素的地址。主函数中p指向i,q指向j,调用r=f(p,q),返回q的地址,因此*p=3,*q=5,*r=5。
9.若有以下程序#include<stdio.h>main(){int k=3;void sp(int*a){int b=2;sp(&k);*a=*a*2;printf("%d\n",k); printf("%d,",*a); } a=&b; *a=*a*2; pfintf("%d,",*a);}则程序的输出结果是
(分数:2.00)
A.6,4,6 √
B.6,4,3
C.6,12,12
D.9,4,9
解析:解析:本题考查了指针作为函数的参数,可以接收实参变量的地址,改变实参的值。主函数调用sp(&k),执行sp函数a指向向k,执行语句*a=*a*2后a指向空间的值k的值为6,改变a的指向以后,此时a指
向b,则执行*a=*a*2以后,a指向空间b的值为4。调用结束返回主函数,输出k的值为6。
10.若有以下程序#include<stdio.h>int k=7,m=5;void f(int**s){int*t=&k;s=&t;*s=&m;printf("%d,%d,%d,",k,*t,**s);} main(){int i=3,*p=&i,**r=&p; f(r); printf("%d,%d,%d
\n",i,*P,**r);}则程序的输出结果是
(分数:2.00)
A.7,5,7,3,3,3,
B.7,5,7,3,5,7,
C.7,5,5,3,3,3,√
D.7,7,5,3,3,3,
解析:解析:本题考查二级指针作为函数的参数,可以通过函数调用来改变主函数中一级指针的指向。主
函数中指针变量p指向i,r指向p,调用f函数,形参指针s指向p,流程转到f函数执行,指针变量t
指向k,s指向t,此时更改了s的指向,s指向了t,更改了s指向的地址空间内容为m的地址,同时t
也指向变量m,因此**s的值为m的值,*t为m的值,k为7。流程返回到主函数,没有对主函数空间的数据和指向作出更改,因此全部为3。
11.若有以下程序#include<stdio.h>int*f(int*s,int*t){int k;if(*s<*t){ k=*s;*s=*t;*t=k;} return s;} main(){int i=3,j=5,*p=&i,*q=&j,*r;r=f(p,q);printf("%d,%d,%d,%d,%
d\n",i,j,*p,*q,*r);}则程序的输出结果是
(分数:2.00)
A.3,5,5,3,5
B.3,5,3,5,5
C.5,3,5,3,5 √
D.5,3,3,5,5
解析:解析:函数f为返回值为指针的函数,主要功能是返回s和t指向空间值大的数据的地址,同时如
何s指向空间数据大于t指向空间的数据,那么交换。主函数p和q指向i和j,值为3和5,j的值大于i的值,因此调用函数f以后,返回i的地址,r指向j,同时i和j的值交换,i=5,j=3,p和q的指向
不变,p指向i,q指向j。
12.有以下程序#include<stdio.h>int funa(int a,int b){return a+b;} int funb(int a,int b){return a-b;} int sss(int(*t)(),int x,int y){return((*t)(x,y));} main(){int x; x=sss(funa,9,3); x+=sss(funb,8,3); printf("%d\n",x);}程序运行后的输出结果是
(分数:2.00)
A.17 √
B.23
C.24
D.22
解析:解析:函数funa的功能计算两个数据的和,funb的功能计算两个数据的差,函数sss中利用指向
函数的指针作为函数的参数,可以在调用的时候,根据接收的函数地址来决定调用那一个函数。主函数中
调用x=sss(funa,9,3),将funa函数的地址传递给t,因此sss函数成为求两个数据的和12,继续将funb 函数地址传给t,求两个数据差为5,和s累加后结果为17。
13.有以下程序 void fun(int x,int y,int*c,int*d) {*c=x+y;*d=x-y;} main(){int a=4,b=3,
c=0,d=0; fun(a,b,&c,&d); printf("%d%d\n",c,d);}程序的输出结果是
(分数:2.00)
A.4 3
B.3 4
C.7 1 √
D.0 0
解析:解析:函数fun有四个形参,功能是利用参数的地址传递来计算前两个参数的和与差。主函数中调
用fun函数c计算4+3,d计算4-3值为1。
14.有以下程序 void fun(int*p,int*q){int t;t=*p;*p=*q;*q=t;*q=*p;} main(){int a=0,b=9;fun(&a,&b); printf("%d%d\n",a,b);}程序的输出结果是
(分数:2.00)
A.0 0
B.9 9 √
C.9 0
D.0 9
解析:解析:函数fun的主要功能是交换p和q指向的地址空间的数据,然后更改p的指向的地址空间数据,使之和q指向的数据相同。主函数调用fun后,p指向a,q指向b,因此a和b的数据全部为9。
15.有以下程序char fun(char*c){if(*c<='Z'&&*c>='A') *c='A'-'a';return*c;} main(){char s[81],*p=s; gets(s); while(*p){ *p=fun(p); putchar(*p); p++;} printf("\n");}若运行时从键盘上输入OPEN THE DOOR,程序的输出结果是
(分数:2.00)
A.oPEN tHE dOOR
B.open the door √
C.OPEN THE DOOR
D.Open The Door
解析:解析:函数fun的主要功能是判断字符是否为大写字符,如果是则转换为小写字符,主函数读入大
写字符串,转换成小写。
16.有以下程序void swap(char*x,char*y) main() {char t;{char*s1="abc",*s2="123";t=*x;*x=*y;*y=t; swap(s1,s2);printf("%s,%s\n",s1,s2); } } 程序执行后的输出结果是
(分数:2.00)
A.abc,123
B.123,abc
C.321,cba
D.1bc,a23 √
解析:解析:函数void swap(char*x,char*y)的功能是交换两个字符*x和*y中的内容。在主函数中字符
指针s1指向字符串'abc',s2指向字符串'123'。所以函数swap(s1,s2)的执行结果就是字符'a'和'1'相
互交换。
17.有以下函数int fun(char*x,char*y){int n=0;while((*x==*y)&&*x!='\0'){ x++;y++;n++;} return n;}函数的功能是
(分数:2.00)
A.查找x和y所指字符串中是否有'\0'
B.统计x和y所指字符串中最前面连续相同的字符个数√
C.将y所指字符串赋给x所指存储空间
D.统计x和y所指字符串中相同的字符个数
解析:解析:在while循环中的判断表达式为(*x==*y)&&*x!='\0',所以只要字符串x与y的当前字符不相等时,循环就结束。
18.有以下函数int fun(char*s){char*t=s;while(*t++);return(t-s);)该函数的功能是
(分数:2.00)
A.比较两个字符串的大小
B.计算s所指字符串的长度
C.计算s所指字符串占用内存字节的个数√
D.将s所指字符串复制到字符串t中
解析:解析:在函数fun(char*s)中,首先用字符指针变量t指向s,而循环语句while(*t++);的功能是使指针变量t指向字符串变量s的末尾,这时退出循环,因而语句return(t-s);返回的就是字符串s所
指字符串的长度。
19.有以下程序(说明:字母A的ASCII码值是65) void fun(char*s){while(*s){ if(*s%2) printf("%c",*s);s++;}} main(){char a[]="BYTE"; fun(a);printf("\n");}程序运行后的输出结果是
(分数:2.00)
A.BT
B.YE √
C.YT
D.BY
解析:解析:程序只输出字母ASCII值为奇数的字母,根据字母B,Y,T,E的ASCII值的奇偶性相应输出。
20.有以下程序 #include<stdio.h> void fun(char**p) {++p;printf("%s\n",*p);} main() {char*a[]=("Morning","Afternoon","Evening","Night"); fun(a);}程序的运行结果是
(分数:2.00)
A.fternoon
B.Morning
C.orning
D.Afternoon √
解析:解析:在程序中,指针的指针变量a和p都是指向字符串的指针。执行fun(a)语句时,p指向的是字符串数组a的第一个字符串“Morning”,p自加1之后,*p指向了字符串数组a的第2个字符串“Afternoon”。
21.有以下程序 void fun1(char宰P) main() {char*q; {char a[]={"Program"),*p; q=p; p=&a[3];fun1(p);printf("%s\n",a); while(*q!='\0') } {(*q)++;q++;}}程序执行后的输出结果是
(分数:2.00)
A.Prphsbn
B.Prohsbn √
C.Progsbn
D.Program
解析:解析:在函数void fun1(char*p)中,语句(*q)++的功能是q所指的字符加1,变成其后面的字符;q++就是指针q指向下一个字符的位置。所以在主函数中,语句p=&a[3]的作用是使指针p指向字符数组a[]中的第四个字符的位置,即p指向字符'g';然后调用函数fun1(p)后,字符'g'变成'g',字符'h',变成's',字符'a'变成'b',字符'm'变成'n',因而字符数组a[]中的内容就成“Prohsbn”。
22.有以下程序 #include<stdio.h> main() void fun(char*a,char*b) { char*s="*****a*b****",t[80]; {while(*a=='*')a++; fun(s,t);puts(t); while(*b=*a){b++;a++;}} }程序的运行结果是(分数:2.00)
A.a*b
B.*****a*b
C.a*b**** √
D.ab
解析:解析:主函数main()定义了指向字符串的指针和一个字符数组,接着调用fun(s,t)函数,进行实参向形参传递,函数fun()第一个while语句判断*a中的值为“*”时继续扫描,当遇到不是“*”时结束,接着第二个while循环语句,将*a中从“a”开始的后续所有字符都赋予*b,也就是t[80]中的内容为
“a*b****”。
23.下列函数的功能是void fun(char*a,char*b){while((*b=*a)!='\0'){a++;b++;}}
(分数:2.00)
A.使指针b指向a所指字符串
B.将a所指字符串和b所指字符串进行比较
C.将a所指字符串赋给b所指空间√
D.检查a和b所指字符串中是否有'\0'
解析:解析:在while语句的条件中是把字符*a的值赋给字符*b,然后再判断字符*b的值是否等于字符串的结束字符('\0'),当不等于结束字符('\0')时,把字符指针变量a,b分别加1,指它们的下一个字符,直到字符串a的结束。这样程序执行的结果就是把字符串a赋给了b所指的存储空间。
24.有以下程序#include<stdio.h>#include<string.h>void fun(char s[][10],int n) {char t;int i,j; for(i=0;i<n-1;i++) for(j=i+l j<n;j++) if(s[i][0]>s[j][0]){t=s[i][0];
s[i][0]=s[j][0];s[j][0]=t;}} main() { char ss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc"};fun(ss,5);printf("%s,%s\n",ss[0],ss[4]);}程序的运行结果是
(分数:2.00)
A.aaaacc,xy
B.bcc,aabcc
C.xy,aaaacc √
D.aabcc,bcc
解析:解析:函数fun(char s[][10],int n)通过两重for循环语句,比较二维字符数组s[][10]的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符,则交换这两个字符串的首字符。在主函数中,语句fun(ss,5)的作用是对二维字符数组ss[5][10]的5个字符串的首字符进行从小到大的排序,不影响各个字符串另外的字符。所以排序结束后,5个字符串的第一个字符依次变为a、a、b、b和x;最后输出第1个和第4个字符串。
25.有以下程序 #include<stdio.h> main() void fun(char*t,char*s) {char ss[10]="acc",
aa[10]="bbxxyy"; {while(*t!=0)t++; fun(ss,aa);printf("%s,%s\n",ss,aa);
while((*t++=*s++)!=0);} }程序的运行结果是
(分数:2.00)
A.acc,bbxxyy
B.accxxyy,bbxxyy
C.accbbxxyy,bbxxyy √
D.accxyy,bbxxyy
解析:解析:fun函数中,第1个while循环语句使指针t指向字符串的末尾,第2个while循环语句实现了字符串t和s的连接。主函数中语句fun(ss,aa)的功能是将字符串aa连接到字符串ss的末尾。
26.有以下程序#include<stdio.h>#include<string.h>void fun(char*w,int m) {char s,*p1,*p2;p1=w;p2=w+m-1;while(p1<p2){s=*p1;*p1=*p2;*p2=s;p1++;p2--;}} main() {char a[]="123456";fun(a,strlen(a));puts(a);}
(分数:2.00)
A.116611
B.161616
C.654321 √
D.123456
解析:解析:函数fun的功能是将字符串w中的元素从大到小进行排列,所以在主函数中调用函数fun后,字符串a的元素从大到小进行了排列。
27.有以下程序:#include<stdio.h>int b=2:int fun(int*k) {b=*k+b;return(b);} main() { int a[10]={1,2,3,4,5,6,7,8},i;for(i=2;i<4;i++){b=fun(&a[i])+b;printf("%d"5b);} printf("\n"):}程序运行后的输出结果是
(分数:2.00)
A.8 10
B.10 28 √
C.10 12
D.10 16
解析:解析:i=2时,nm(&a[2])返回值是b=b+a[1]=2+3=5,b=b+b=5+5=10;i=3时,fun(&a[3])返回值是b=b+a[3]=10+4=14,b=b+b=14+14=28。
28.有以下程序 #include<stdio.h> #include<string.h> void fun(int*p1,int*p2,
int*s){ s=(int*)calloc(1,sizeof(int));*s=*p1+*p2;free(s);} main(){ int a[2]=={1,2},b[2]={40,50},*q=a; fun(a,b,q); printf("%d\n",*q);}程序运行后的输出结果是
(分数:2.00)
A.41 √
B.42
C.0
D.1
解析:解析:主函数定义数组a,b,q指向数组a,调用fun函数以后形参接收实参的数据,p1和p2指向数组a和b,同时s指向数组a,在fun函数中改变了s的指向和赋值,但是在程序调用结束之间形参空间全部释放,因此对于s的指向改动不会对主函数参数构成影响。因此主函数中数去*q的值仍然为1。