1、国家二级 C 语言机试(编译预处理和指针)模拟试卷 9 及答案解析(总分:52.00,做题时间:90 分钟)一、选择题(总题数:26,分数:52.00)1.设有定义: int x=0,*p;紧接着的赋值语句正确的是(分数:2.00)A.*p=NULL;B.p=NULL;C.p=x;D.*p=x;2.以下叙述中错误的是(分数:2.00)A.函数可以返回地址值B.改变函数形参的值,不会改变对应实参的值C.当在程序的开头包含头文件 stdioh 时,可以给指针变量赋 NULLD.可以给指针变量赋一个整数作为地址值3.设已有定义: float x:则以下对指针变量 p 进行定义且赋初值的语句中正确的是
2、(分数:2.00)A.int*p=(float)x;B.float*p=x;C.float p=&x;D.float*p=1024;4.有以下程序,程序运行后的输出结果是 main()int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r; printf(“d,d,d,dn“,m,n,*p,*q);(分数:2.00)A.1,2,1,2B.1,2,2,1C.2,1,2,1D.2,1,1,25.下面选项中的程序段,没有编译错误的是(分数:2.00)A.char*sp,s10;sp=“Hello“;B.char*sp,s10;s=“Hello“;C.char strl10=“
3、computer“,str210;str2=str1;D.char mark;mark=“PROGRAM“;6.设有定义 double a10,*s=a;以下能够代表数组元素 a3的是(分数:2.00)A.(*s)3B.*s3C.*s+3D.*(s+3)7.有以下程序,执行后的输出结果是 main()int a=1,b=3,c=5; int*p1=a,*p2=b,*p=c; *p=*p1*(*p2); printf(“dn“,c);(分数:2.00)A.2B.3C.1D.48.若有定义语句: int a23,*p3;则以下语句中正确的是(分数:2.00)A.p0=&a12;B.p0=a;C.p
4、=a;D.p1=&a;9.若有定义语句:int year=2009,*p=&year;以下不能使变量 year 中的值增至 2010 的语句是(分数:2.00)A.(*p)+;B.+(*p);C.*p+;D.*p+=1;10.有以下程序 main()int a5=2,4,6,8,10,*p,*k; p=a: k=&p; printf(“d“,*(p+);printf(“dn“,*k); 程序运行后的输出结果是(分数:2.00)A.4 4B.2 4C.2 2D.4 611.以下叙述中正确的是(分数:2.00)A.如果 p 是指针变量,则*p 表示变量 P 的地址值B.如果 p 是指针变量,则&p
5、 是不合法的表达式C.在对指针进行加、减算术运算时,数字 1 表示 1 个存储单元的长度D.如果 p 是指针变量,则*p+1 和*(p+1)的效果是一样的12.有以下程序(注:字符 a 的 ASCII 码值为 97) main()char*s=“abc“; doprintf(“d“,*s10);+s;while(*s);) 程序运行后的输出结果是(分数:2.00)A.abcB.7890C.979899D.78913.设有定义: char*c:以下选项中能够使 c 正确指向一个字符串的是(分数:2.00)A.char str=“string“;c=str;B.scanf(“s“,c);C.c=g
6、etchar();D.*c=“string“;14.有以下程序 #include main() int n,*p=NULL; *p=&n: printf(“Input n:“);scanf(“d“,&p);printf(“output n:“); printf(“dn“,p); 该程序试图通过指针 p 为变量 n 读入数据并输出,但程序有多处错误,以下语句正确的是(分数:2.00)A.int n,*p=NULL;B.*p=&n;C.scanf(“d“,&p)D.printf(“dn“,p);15.若有定义语句:double a,*p=a;以下叙述中错误的是(分数:2.00)A.定义语句中的*号
7、是一个说明符B.定义语句中的 p 只能存放 double 类型变量的地址C.定义语句中*p=a 把变量 a 的地址作为初值赋给指针变量 pD.定义语句中的*号是一个间址运算符16.若有以下定义 int x10,*pt=x;则对 x 数组元素的正确引用是(分数:2.00)A.*(x+3)B.*&x10C.*(pt+10)D.pt+317.有以下程序 int fun1(double a)return a*=a; int fun2(double x,double y) double a=0,b=0; a=fun 1(x);b=fun 1(y);return(int)(a+b); main() dou
8、ble w;w=fun2(11,2,0); 程序执行后输出结果是(分数:2.00)A.500B.5C.521D.0018.有以下程序 void fun(char*s)char a10; main()char*p=“PROGRAM“; strcpy(a,“STRING“); fun(p); s=a; printf(“sn“,p); 程序运行后的输出结果是(此处代表空格)(分数:2.00)A.STIUNGB.PROGRAMC.STIUNGD.STRING19.有以下程序 void fun(int n,int*s)int f; if(n=1)*s=n+1; elsefun(n-1,f);s=f; m
9、ain()int x=0; fun(4,&x); printf(“dn“,x); 程序运行后的输出结果是(分数:2.00)A.1B.3C.4D.220.有以下程序 #include int fun(char*s)char*p=s; while(*p!=0)p+; return(p-s); main()printf(“dn“,fun(“goodbey!“); 程序的输出结果是(分数:2.00)A.6B.8C.0D.721.有以下程序 #include main() #define N 4 int xN=1,2,3),4),5,6,7,8),9,10,void fun(int aN,int b)
10、yN,i; int i; fun(x,y); for(i=0;iA.1,2,3,4,B.1,4,5,9,C.1,0,7,0,D.3 94,8,10,22.有下列程序: void f(int*q) main() int i=0; int a5=1,2,3,4,5,i; for(;iA.2,2,3,4,5,B.6,2,3,4,5,C.i,2,3,4,5,D.2,3,4,5,6,23.有以下程序 #include main() void fun(char*c,int d) char b=a,a=A; *c=*c+1;d=d+1; fun(&b,a);printf(“c,cn“,b,a); print
11、f(“c,c,“,*c,d); 程序运行后的输出结果是(分数:2.00)A.b,B,b,AB.b,B,B,AC.a,B,B,aD.a,B,a,B24.以下函数按每行 8 个输出数组中的数据: void fun(int*w,int n) int i; for(i=0;iA.if(i8=0)printf(“n“);B.if(i8=0)continue;C.if(i8=0)printf(“n“);D.if(i8=0)continue;25.有以下程序: #include void main() void fun(char*c) char s81; while(*c) gets(s);fun(s);p
12、uts(s); if(*c=a&*c=a&*c=z)*c=*c-(a一A); c+; 当执行程序时从键盘上输入 Hello Beijing,则程序的输出结果是(分数:2.00)A.HELLO BEIJING B.Hello BeijingC.hello BeijingD.hELLO Beijing解析:解析:子函数 fun 的功能是把小写字母转换成大写字母,所以程序的输出结果为选项 A。26.有以下程序 #include void f(nt*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,3B.1,3 C.1,4D.1,2解析:解析:本题考查函数的调用与指针。fun()函数的作用是:使指针 p 指向原来所指变量的下一个变量,使 q 指针指向的值加 1。主函数中,指针 r 指向 m,调用 fun()函数的结果是,使 r 指向地址位于 m后面的变量,使位于 n 的地址上的变量(就是 n)的值加 1,因此,结果为 1,3。