1、国家二级 C语言(编译预处理和指针)机试模拟试卷 6及答案与解析 一、选择题 1 以下关于宏的叙述中正确的是 ( A)宏定义必须位于源程序中所有语句之前 ( B)宏名必须用大写字母表示 ( C)宏调用比函数调用耗费时间 ( D)宏替换没有数据类型限制 2 有以下程序,程序运行后的输出结果是 #include stdio h #define SUB(a)(a)-(a) main()int a=2, b=3, C=5, d; d=SUB(a+b)*c: printf(“ d n“, d); ( A) -12 ( B) 0 ( C) 10 ( D) -20 3 以下叙述中错误的是 ( A)预处理命令
2、行的最后不能以分号表示结束 ( B) C程序对预处理命令行的处理是在程序执行的过程中进行的 ( C) #define MAX是合法的宏定义命令行 ( D)在程序中凡是以 “#”开始的语句行都是预处理命令行 4 有以下程序,程序运行后的输出结果是 #include stdio_h #define N 2 #define M N+1 #define NUM(M+1)*M 2 main()orintf(“ d n“, NUM1); ( A) 4 ( B) 8 ( C) 9 ( D) 6 5 有以下程序,程序的输出结果是 #include stdio h #define SQR(X)X*X main(
3、)int a=10, k=2, m=1; a =SQR(k+m) SQR(k+m); printf(“ d n“, a); ( A) 0 ( B) 1 ( C) 9 ( D) 10 6 有以下程序,程序运行后的输出结果是 #include stdio h #include stdlib-h main() int*a, *b, *c; a=b=c=(int*)malloc(sizeof(int); *a=1: *b=2, *c=3; a=b; printf(“ d, d, d n“, *a, *b, *c); ( A) 2, 2, 3 ( B) 3, 3, 3 ( C) 1, 2, 3 ( D)
4、 1, 1, 3 7 有以下程序,程序的输出结果是 void fun(double*p1, double*p2, double*s) s=(double*)calloc(1, sizeof(double); *s=*P1+*(p2+1); main()double a2=1 1, 2 2, b2=10 0, 20 0, *s=a; fun(a, b, s); printf(“ 5 2f n“, *s); ( A) 1 10 ( B) 11 10 ( C) 12 10 ( D) 21 10 8 以下叙述中正确的是 ( A)指针变量只能通过求地址运算符 (&)来获得地址值 ( B)语句 “p=NU
5、LL; ”与 “p= 0; ”是等价的语句 ( C) “int*P1; int*p2; int*p3; ”都是合法的定义指针变量的语句 ( D)语句 p=NULL;执行后,指针 P指向地址为 0的存储单元 9 设有定义: int x=0, *p;紧接着的赋值语句正确的是 ( A) *p=NULL; ( B) p=NULL; ( C) p=x; ( D) *p=x; 10 有以下程序,程序运行后的输出结果是 main()int m=1, n=2, *p=&m, *q=&n, *r; r=p; p=q; q=r; printf(“ d, d, d, d n“, m, n, *p, *q); ( A
6、) 1, 2, 1, 2 ( B) 1, 2, 2, 1 ( C) 2, 1, 2, 1 ( D) 2, 1, 1, 2 11 有以下程序,执行后的输出结果是 main()int a=1, b=3, c=5; int*p1=&a, *p2=&b, *p=&c; *p=*p1*(*p2); printf(“ d n“, c); ( A) 2 ( B) 3 ( C) 1 ( D) 4 12 有以下程序 main()int a5=2, 4, 6, 8, 10, *p, *k; p=a: k=&p; printf(“ d“, *(p+); printf(“ d n“, *k); 程序运行后的输出结果是
7、 ( A) 4 4 ( B) 2 4 ( C) 2 2 ( D) 4 6 13 设有定义 : char*c:以下选项中能够使 c正确指向一个字符串的是 ( A) char str=“string“; c=str; ( B) scanf(“ s“, c); ( C) c=getchar(); ( D) *c=“string“; 14 若有以下定义 int x10, *pt=x;则对 x数组元素的正确引用是 ( A) *(x+3) ( B) *&x10 ( C) *(pt+10) ( D) pt+3 15 有以下程序 void fun(int n, int*s)int f; if(n=1)*s=n
8、+1; elsefun(n-1, &f); *s=f; main()int x=0; fun(4, &x); printf(“ d n“, x); 程序运行后的输出结果是 ( A) 1 ( B) 3 ( C) 4 ( D) 2 16 有下列程序: void f(int*q) main() int i=0; int a5=1, 2, 3, 4, 5), i; for(; i 5; i+)(*q)+; ) f(a); for(i=0; i 5; i+)printf(“ d, “, ai); 程序运行后的输出结果是 ( A) 2, 2, 3, 4, 5, ( B) 6, 2, 3, 4, 5, (
9、C) 1, 2, 3, 4, 5, ( D) 2, 3, 4, 5, 6, 17 有以下程序: #include stdio h void main() void fun(char*c) char s81; while(*c) gets(s); fun(s); puts(s); if(*c =a&*c =z)*c=*c-(a-A); C+: 当执行程序时从键盘上输入 Hello Beijing回车,则程序的输出结果是 ( A) HELLO BEIJING ( B) Hello Beijing ( C) hello Beijing ( D) hELLO Beijing 18 有下列程序: voi
10、d f(int b) int I: for(i=2; i 6; i+)bi=2; main() int a10=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, i; f(a); for(i=0; i 10, i+)printf(“ d, “, ai); 程序运行后的输出结果是 ( 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,
11、19 若有以下程序 #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); 则程序的输出结果是 ( 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 20 若有以下程序 #include stdio h int k=7,
12、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); 则程序的输出结果是 ( 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, 21 有以下程序 void fun(int x, int y, int*c, int*d) *c=x+y; *d
13、=x-y; main()int a=4, b=3, c=0, d=0; fun(a, b, &c, &d); printf(“ d d n“, c, d); 程序的输出结果是 ( A) 4 3 ( B) 3 4 ( C) 7 1 ( D) 0 0 22 有以下 程序 void swap(char*x, char*y) main() char t; char*s1=“abc“, *S2=“123“; t=*x; *x=*y; *y=t; swap(s1, s2); pfintf(“ s, s n“, s1, s2); 程序执行后的输出结果是 ( A) abc, 123 ( B) 123, abc
14、 ( C) 321, cba ( D) 1bc, a23 23 有以下程序 (说明:字 *A的 ASCII码值是 65) void fun(char*s)while(*s) if(*s 2) printf(“ c“, *s); s+; main()char a=“BYTE“; fun(a); printf(“ n“); 程序运行后的输出结果是 ( A) BT ( B) YE ( C) YT ( D) BY 24 有以下程序 #include stdio h main() void fun(char*a, char*b) char*s=“*a*b*“, t80; while(*a=*)a+; f
15、un(s, t); puts(t); while(*b=*a)b+; a+; 程序的运行结果是 ( A) a*b ( B) *a*b ( C) a*b* ( D) ab 25 有以下程序 #include stdio h main() void fun(char*t, char*s) char ss10=“acc“, aa10=“bbxxyy“; while(*t!=0)t+; fun(ss, aa); printf(“ s, s n“, ss, aa); while(*t+=*s+)!=0); 程序的运行结果是 ( A) acc, bbxxyy ( B) accxxyy, bbxxyy (
16、C) accbbxxyy, bbxxyy ( D) accxyy, bbxxyy 26 有以下程序 #include stdio h #include string h void fun(int*p1, int*p2, int*s) s=(int*)calloc(1, sizeof(int); *s=*p1+*p2; flee(s); main() int a2=1, 2, b2=40 50, *q=a; fun(a, b, q); printf(“ d n“, *q); 程序运行后的输出结果是 ( A) 41 ( B) 42 ( C) 0 ( D) 1 国家二级 C语言(编译预处理和指针)机
17、试模拟试卷 6答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 本题考查宏替换的规则。宏替换分为简单的宁符替换和带参数的宏替换两类。使用宏时应注意几点: 宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查; 为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写; 双引号中出现的宏名不替换; 使用宏定义可以嵌套 ,即后定义的宏中可以使用先定义的宏。 【知识模块】 编译预处理和指针 2 【正确答案】 D 【试题解析】 本题主要考查的是宏替换,在程序中执行 d=sub(a+b)*c这条语句时,首先要进行宏替换,依据宏 sUB(a)的定义可知,上面这条语句替换为d=(a+
18、b)-(a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即 d=5-5*5=-20。 【知识模块】 编译预处理和指针 3 【正确答案】 B 【试题解析】 预处理命令行是以 “#”开始的语句,预处理命令行的最后不 能以分号表示结束,预处理命令行。其中宏定义的字符替换的定义格式为: #define标识符字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执行的过程中。 【知识模块】 编译预处理和指针 4 【正确答案】 B 【试题解析】 宏展开以后 NUM为 (2+1+1)*2+1 2,计算以后值为 8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计
19、算。 【知识模块】 编译预处理和指针 5 【正确答案】 B 【试题解析】 SQR(k+m)宏展开以后为 k+m*k+m,值 为 5,表达式 a=SQR(k+m) SQR(k+m)为 a=a (5+5),表达式值为 1。 【知识模块】 编译预处理和指针 6 【正确答案】 B 【试题解析】 a=b=c=(int*)malloc(sizeof(int):含义为申请了一个整型的存储空间,让指针 a, b, c分别指向它, *a=1; *b=2; *c=3;语句的含义为所申请的整型存储空间的内容, *c=3最后执行导致存储空间的内容为 3。 a=b的含义让指针 a也指向指针 b所指向的存储空间, a,
20、b, c都指向整型的存储空间,里边的内容为3。 【知识模块】 编译预处理和指针 7 【正确答案】 A 【试题解析】 ANSIC标准规定 calloc函数返回值的类型为 void*。具体使用格式为: calloc(n, size)。 该函数用来给 n个同一类型的数据项分配连续的存储空间,每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。通过调用calloc函数所分配的存储单元,系统自动置初值 0。 主函数中定义数组 a, b,以及指针 s指向数组 a,调用 fun函数,实参 a和 b,以及 s的值传递给相对应形参 p1, p2,以及 s,在 fun函数中更改 s
21、的指向,以及指向的数据,但是函数调用结束以后,形参空间撤销,这项改变对于实参没有影响。因此实参 s指向值不变,仍然为 1 1。 【知识模块】 编译预处理和指针 8 【正确答案】 C 【试题解析】 指针变量定义形式为:类型 *指针变量名; 其中 *号的个数决定了几级指针,指针变量赋地址值的方式有 3种方式: 通过求地址运算符 (&)获得地址值; 通过指针变量获得地址值; 通过标准函数获得地址值。另外 NULL是在 stdio h头文件中定义的预定义符。 NULL的代码值为 0。可以给指针变量 赋 NULL值。例如 p=NULL;赋值语句,称 p为空指针。这条语句等价于 p= 0;或 p=0;这时
22、,指针 p并不是指向地址为 0的存储单元,而是具有一个确定的值 “空 ”。 【知识模块】 编译预处理和指针 9 【正确答案】 B 【试题解析】 定义指针变量时,必须将指针变量初始化为 NULL(为空 ),否则,如果不赋给它地址,系统会随机给它分配一个地址。 【知识模块】 编译预处理和指针 10 【正确答案】 B 【试题解析】 在主函数定义了 3个整数指针变量 p, q, r,并且使 p指向 m, q指 向 n,再执行 “r=p; p=q; q=r; ”这三条语句,使 q指向 m, p指向 n,再输出变量 “m, n, *p, *q”时,它们值分别为 1, 2, 2, 1。 【知识模块】 编译预
23、处理和指针 11 【正确答案】 B 【试题解析】 程序使整型指针 p1、 p2、 p3指向 a、 b、 c值所存放的地址空间。然后再将指针变量 *p1、 *p2中的值的乘积赋给指针变量 *p,即赋给变量 c,输出 c的值 3。 【知识模块】 编译预处理和指针 12 【正确答案】 B 【试题解析】 主函数中指针变量 p指向数组 a中下标为 0的元素, k指向 p,那么 *(p+)的值为 2, p指向数组中下标为 1的元素, k指向 p,所以 *k的值为 4。 【知识模块】 编译预处理和指针 13 【正确答案】 A 【试题解析】 在题目的题干中定义了字符指针变量 c,在选项 A)中,首先定义字符数
24、组 str,然后再把字符数组 str的酋地址赋给字符指针变量 c。所以选项 A)是正确的。在选项 D)中,如果在定义字符指针 c时,同时给 c赋初值时,这样的表达式是正确的。而本题不是在定义指针 c时,同时给 c赋初值。 【知识模块】 编译预处理和指针 14 【正确答案】 A 【试题解析】 本题考查指针的调用。 x代表 x10数组的首地址指针, pt是指向x10数组的首地址的指针,即两者指向同一内存单元。 +(x+3)等同于 x3。 【知识模块】 编译预处理和指针 15 【正确答案】 D 【试题解析】 函数 fun为递归调用函数,如果 n的值为 1,那么后面形参指向的空间存放 n+1,否则继续
25、计算 fun(n-1)的值。调用分析过程: fun(4, &x)fun(3 ,&x)fun(2 , &x)fun(1 , &x)在回归的过程中,对于 x内的数据并没有改动。 【知 识模块】 编译预处理和指针 16 【正确答案】 B 【试题解析】 void f(int *q)函数的功能是对 (*q)的值连续 5次自加 1。在 main()函数中 f(a)语句把一维数组 a5的首地址作为实参,传递给函数 f(int q)的形参 q,然后在函数 f(int*q)内, a0连续 5次自加 1后, a0的值就变成 6,所以输出为6, 2, 3, 4, 5。 【知识模块】 编译预处理和指针 17 【正确答
26、案】 A 【试题解析】 子函数 fun的功能是把小写字母转换成大写字母,所以程序的输出结果为 选项 A)。 【知识模块】 编译预处理和指针 18 【正确答案】 C 【试题解析】 函数 void f(int b)的功能是对数组 b中第 2个到第 5个元素的值逐个扩大 2倍。所以在 main()函数中, f(a)语句的作用是对数组 a10中从 a2到a5的各个数字乘以 2,因而数组 a10的元素就变成了 1, 2, 6, 8, 10, 12, 7,8, 9, 10。 【知识模块】 编译预处理和指针 19 【正确答案】 D 【试题解析】 本题考查了二级指针,二级指针可以保存一级指针的地址 。主函数中
27、 p指向 i, r指向 p。函数调用后 s指向 p,在 f函数中 t指向全局变量 k=7, s指向 t,同时 s保存了实参 p的地址,此时 p也指向 t,输出三个 7,流程转到主函数, i的值为 3, p以及 r的值为 7。 【知识模块】 编译预处理和指针 20 【正确答案】 C 【试题解析】 本题考查二级指针作为函数的参数,可以通过函数调用来改变主函数中一级指针的指向。主函数中指针变量 p指向 i, r指向 p,调用 f函数,形参指针 s指向 p,流程转到 f函数执行,指针变量 t指向 k, s指向 t,此时更改了 s的指向, s指向了 t,更改了 s指向的地址空间内容为 m的地址,同时 t
28、也指向变量m,因此 *s的值为 m的值, *t为 m的值, k为 7。流程返回到主函数,没有对主函数空间的数据和指向作出更改,因此全部为 3。 【知识模块】 编译预处理和指针 21 【正确答案】 C 【试题解析】 函数 fun有四个形参,功能是利用参数的地址传递来计算前两个参数的和与差。主函数中调用 fun函数 c计算针 3, d计算 4-3值为 1。 【知识模块】 编译预处理和指针 22 【正确答案】 D 【试题解析】 函数 void swap(char*x, char*y)的功能是交换两个字符 *x和 *y中的内容。在主函数中字符指针 s1指向字符串 abc, s2指向字符串 123。所以
29、函数swap(s1, s2)的执行结果就是字符 a和 1相互交换。 【知识模块】 编译预处理和指针 23 【正确答案】 B 【试题解析】 程序只输出字母 ASCII值为奇数的字母,根据字母 B, Y, T, E的 ASCII值的奇偶性相应输出。 【知识模块】 编译预处理和指针 24 【正确答案】 C 【试题解析】 主函数 mare()定义了指向字符串的指针和一个字符数 组,接着调用 fun(s, t)函数,进行实参向形参传递。函数 fun()第一个 while语句判断 *a中的值为 “+”时继续扫描,当遇到不是 “*”时结束,接着第二个 while循环语句,将 *a中从 “a”开始的后续所有字
30、符都赋予 *b,也就是 t80中的内容为 “a*b*”。 【知识模块】 编译预处理和指针 25 【正确答案】 C 【试题解析】 fun函数中,第 1个 while循环语句使指针 t指向字符串的末尾,第 2个 while循环语句实现了字符串 t和 s的连接。主函数中语句 fun(ss, aa)的功能是将 字符串 aa连接到字符串 ss的末尾。 【知识模块】 编译预处理和指针 26 【正确答案】 A 【试题解析】 主函数定义数组 a, b, q指向数组 a,调用 fun函数以后形参接收实参的数据, p1和 p2指向数组 a和 b,同时 s指向数组 a,在 fun函数中改变了 s的指向和赋值,但是在程序调用结束之间形参空间全部释放,因此对于 s的指向改动不会对主函数参数构成影响。因此主函数中数去 *q的值仍然为 1。 【知识模块】 编译预处理和指针