1、国家二级 C语言机试(翻译预处理和指针)模拟试卷 12及答案与解析 一、选择题 1 以下程序的输出结果是 ( )。 #define PT 3 5; #define S(x)PT*x*x; main()int a=1, b=2; printf( 4 1f n, S(a+b); ( A) 14 0 ( B) 7 5 ( C)程序有错无输出结果 ( D) 31 5 2 以下程序的输出结果是 ( )。 #include #define S(x)4*(x)*x+1 void main() int k=5, j=2; printf( d n, S(k+j); ( A) 33 ( B) 143 ( C) 2
2、8 ( D) 197 3 以下程序的输出结果是 ( )。 #include #define SUB(A)(A) (A) main()int a=2, b=3, c=5, d; d=SUB(a+b)*c; printf( d n, d); ( A) 0 ( B) 10 ( C)一 12 ( D)一 20 4 以下程序的输出结果是 ( )。 #include #define N 5 #define M N+1 #define f(x)(x*M) main() int i1, i2; il=f(2); i2=f(1+1); printf( d d n, il, i2); ( A) 12 12 ( B
3、) 12 7 ( C) 12 11 ( D) 11 7 5 关于 #define N 100的叙述中正确的是 ( )。 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)上述宏定义行实现将 100赋给标识符 N ( C)在运行时用 100替换标识符 N ( D)在编译程序对 C源程序进行预处理时用 100替换标识符 N 6 以下程序的输出结果是 ( )。 #include #define N 2 #define M N+1 #define NUM(M+1)*M 2 main()printf( d n, NUM); ( A) 9 ( B) 8 ( C) 7 ( D) 6 7 以下程序
4、的输出结果是 ( )。 #include #include int fun(int n) main() int *P; int a; p=(int *)malloc(sizeof(int); a=fun(10); *p=n; return *p; printf( d n, a+fun(10); ( A) 21 ( B) 20 ( C) 10 ( D) 11 8 关于 int(*f)(int);的叙述中正确的是 ( )。 ( A) f是基类型为 int的指针变量 ( B) f是指向 int类型一维数组的指针变量 ( C) f是指向函数的指针变量,该函数具有一个 int类型的形参 ( D) f是函
5、数名,该函数的返回值是基类型为 int类型的地址 9 关于函数参数的叙述中正确的是 ( )。 ( A)函数的形参类型不能是指针类型 ( B)函数的类型不能是指针类型 ( C)基类型不同的指针变量可以相互混用 ( D)设有指针变量为 “double *p”,则 “p+1”将指针 p移动 8个字节 10 设 int x=0, *p;下列赋值语句正确的是 ( )。 ( A) *p=x; ( B) p=NULL; ( C) p=x; ( D) *p=NULL; 11 22设 float x;则以下对指针变量 P进行定义且赋初值的语句中正确的是 ( )。 ( A) float *p=1; ( B) fl
6、oat *p=&x; ( C) float p=&x; ( D) int *p=(float)x; 12 没有编译错误的程序段是 ( )。 ( A) char*sp, s10; sp=Hello; ( B) char*sp: s10; s=Hello; ( C) char strl10=computer, str210; str2=str1: ( D) char mark; mark=PROGRAM; 13 以下程序的输出结果是 ( )。 main() int a=I, b=3, c=5; int *pl=&a, *p2=&b, *p=&c; *p=*p1*(*p2); printf( d n
7、, c); ( A) 4 ( B) 3 ( C) 2 ( D) 1 14 若 int year=一 2009, *p=&year;以下不能使变量 year中 的值增至 2010的语句是 ( )。 ( A) (*p)+; ( B) +(*P); ( C) *p+; ( D) *p+=1; 15 若 int x10, *pt=x;则对 x数组元素的正确引用是 ( )。 ( A) *(x+3) ( B) *&x10 ( C) *(pt+10) ( D) pt+3 16 以下程序的输出结果是 ( )。 void fun(char *s)char a10; main()char *p=PROGRAM;
8、strcpy(a, STRING); fun(p); s=a; printf( s n, p); ( A) STRING? ( B) PROGRAM ( C) STRING? ( D) STRING? 17 以下程序的输出结果是 ( )。 #include int fun(char*s)char*p=s; while(*p! =0)p+; return(pS); main()printf( d n, fun(goodbey! ); ( A) 7 ( B) 8 ( C) 9 ( D) 0 18 以下程序的输出结果是 ( )。 void f(int*q) main() int i=0; int a
9、5=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, ( C) 1, 2, 3, 4, 5, ( D) 2, 3, 4, 5, 6, 19 以下程序的输出结果是 ( )。 #include 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,
10、 q); printf( d, d, d, d, d n, i, j, *P, *q, *r); ( A) 3, 5, 5, 3, 5 ( B) 3, 5, 3, 5, 5 ( C) 5, 3, 5, 3, 5 ( D) 5, 3, 3, 5, 5 20 以下程序的输出结果是 ( )。 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); ( A) 0 0 ( B) 3 4 ( C) 7 1 (
11、D) 4 3 21 若运行时从键盘上输入 OPEN THE DOOR,以下程序的输出结果是 ( )。 char fun(char*C)if(*e =Z&*c=A) *c一 =A一 a: return*c; main()char s81, *p=s; gets(s); while(*P) *p=fun(p); putchar(*P); p+; prinnf( n); ( A) OPEN THE DOOR ( B) open the door ( C) oPEN tHE dOOR ( D) Open The Door 22 以下函数的功能是 ( )。 int fun(char*x, char*y)
12、int n=0; while(*x=*y)&*x! = 0) x+; y+; n+; return n; ( A)统计 x和 y所指字符串中相同的字符个数 ( B)统计 x和 y所指字符串中最前面连续相同的字符个数 ( C)将 y所指字符串赋给 x所指存储空间 ( D)查找 x和 y所指字符串中是否有 0 23 以下程序的输出结果是 ( )。 (说明:字母 A的 ASC 码值是 65) void fun(char*s)while(*s) if(*s 2) printf( c, s); s+; main()char a=BYTE; fun(a); printf( n); ( A) YT ( B)
13、 YE ( C) BT ( D) BY 24 以下程序的输出结果是 ( )。 void funl(char*p) main() char*q; char a=Program, *p; q=p; p=&a3; funl(p); printf( s n, a); while(*q! = 0) (*q)+; q+; ( A) Program ( B) Prohsbn ( C) Progsbn ( D) Prphsbn 25 以下函数的功能是 ( )。 void fun(char*a, char*b) while(*b=*a)! = 0)a+; b+; ( A)使指针 a指向 b所指字符串 ( B)检
14、查 a和 b所指字符串中是否有 0 ( C)将 a所指字符串赋给 b所指空间 ( D)将 a所指字符串和 b所指字符串进行比较 国家二级 C语言机试(翻译预处理和指针)模拟试卷 12答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 C语言规定预处理语句后面不能加分号,因此程序有错。如果没加分号的话 S(a+b)=PT*a+b*a+b=3 5*1+2*1+2=7 5。 【知识模块】 编译预处理和指针 2 【正确答案】 B 【试题解析】 本题考查带参数的宏的定义和替换点。在程序中定义了带参数的宏S(x),当在主函数中用参数 k+i调用宏 S时,根据宏替换的原则,则S(k+j)=S(5+2
15、)=4*7*5+2+1=143。 【知识模块】 编译预处理和指针 3 【正确答案】 D 【试题解析】 本题主要考查的是宏替换,在程 序中执行 d=SUB(a+b)*c这条语句时,首先要进行宏替换,依据宏 SUB(A)的定义可知,上面这条语句替换为d=(a+b)一 (a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即 d=55*5=一 20,可以看出,出现了运算错误。 【知识模块】 编译预处理和指针 4 【正确答案】 D 【试题解析】 本题考查了宏的嵌套定义定义了 3个宏定义语句,分别是:#defineN 5、 #defineM N+1和 #definef(x)(x*M),所
16、以根据 C语言的宏交替规则,我们可知, f(2)=2*N+1 2*5+1=11, f(1+1)=1+1*N+1=1+1*5+1=7。 【知识模块】 编译预处理和指针 5 【正确答案】 D 【试题解析】 在 C语言中,凡是以 “#”开头的行,都称为 “翻译预处理 ”。其含义是在 C编译程序对 C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程,即在程序执行之前就处理了。由 #define定义的宏就是编译预处理命令。 C程序在进行编译之前,都要先对程序中所有出现的 “宏名 ”。都用宏定义中的替换文本进行替换。 【知识模块】 编译预处理和指针 6 【正确答案】 B 【试题解析】
17、本题考查宏替换。宏展开以后 NUM为 (2+1+1)*2+1 2,计算以后值为 8。在进行宏展开的时候,要展开以后再进行计算。 【知识模块】 编译预处理和指针 7 【正确答案】 B 【试题解析】 本题考查内存申请。函数 fun(int n)的功能是在内存中每次动态地申请一个整型变量的存储空间,把整型变量 n的值存入这个存储空间中。所以当在主函数中执行输出语句时, a+fun(10)的值等于 20。 【知识模块】 编译预处理和指针 8 【正确答案】 C 【试题解析】 题目中定义语句 int(*f)(int)中 f是指向函数的指针变量,该函数中也只有一个 int型的形参。 【知识模块】 编译预处理
18、和指针 9 【正确答案】 D 【试题解析】 C语言中在对指针进行加、减算术运算时,数字 1表示 1个存储单元的长度,而 double类型数据在内存中占 8个字节,因此移动一次移动 8个字节。其他三个都不正确。 【知识模块】 编译预处理和指针 10 【正确答案】 B 【试题解析】 定义指针变量时,必须将指针变量初始化为 NULL(为空 ),否则,如果不赋给它地址,系统会随机给它分配一个地址以致出现错误的运算结果。 【知识模块】 编译预处理和指针 11 【正确答案】 B 【试题解析】 C语言中定义指针变量的一般形式为类型名木指针变量名 1, *指针变量名 2, 因而在选项 B的表达式中,赋值号的左
19、边表示定义了指针变量p,而右边表示求变量 x的地址值。 【知识模块】 编译预处理和指针 12 【正确答案】 A 【试题解析】 本题考查了赋值表达式。选项 B中数组名为常量,不能赋值,选项 C数组之间无法完成赋值操作,选项 D和选项 B相同, 无法对数组进行赋值。 【知识模块】 编译预处理和指针 13 【正确答案】 B 【试题解析】 C语言中,指针可以指向一个数组,程序使整型指针 p1、 p2、 p指向 a、 b、 c值所存放的地址空间。然后再将指针变量 *pl、 *p2中的值的乘积赋给指针变量 *p,即赋给变量 c,输出 c的值 3。 【知识模块】 编译预处理和指针 14 【正确答案】 C 【
20、试题解析】 本题考查运算符的优先级。由于自加运算符 +的运算级高于间接运算符 *的运算级,所以选项 C的表达式 *p+不能使变量 year中的值增至 2010。 【知识模块】 编译预处理和指针 15 【正确答案】 A 【试题解析】 本题考查指针的调用。 x代表数组的首地址指针, pt是指向 x10数组的首地址的指针,即两者指向同一内存单元。 *(x+3)等同于 x3, pt+3是指针类型, B和 C下标超限。 【知识模块】 编译预处理和指针 16 【正确答案】 B 【试题解析】 题目中函数 fun的主要功能是把字符串 “STRING”,存放到字符数组 a中, s指向该字符串,函数调用结束以后,
21、释放 s和 a指向的空间。主函数调用 fun(p),并不 能更改 p的值,因此 p的指向没有改变,还是原来的值。 【知识模块】 编译预处理和指针 17 【正确答案】 B 【试题解析】 题目中函数 fun的主要功能是计算字符串中实际字符的个数不包括结束符 0,因此 “goodbey! ”含有字符为 8,返回值为 8。 【知识模块】 编译预处理和指针 18 【正确答案】 B 【试题解析】 题目中 void f(int*q)函数的功能是对 (*q)的值连续 5次自加 1。在main函数中 f(a)语句把一维数组 a5的首地址作为实参,传递给函数 f(int*q)的形参 q,然后在函数 f(int*q
22、)内, a0连续 5次自加 1后, a0的值就变成 6。所以输出为 6, 2, 3, 4, 5,选项 B正确。 【知识模块】 编译预处理和指针 19 【正确答案】 C 【试题解析】 题目中函数 f为返回值为指针的函数,主要功能是返回 s和 t指向空间值大的数据的地址,同时如果 s指向空间数据小于 t指向空间的数据,那么交换。主函数 p和 q指向 i和 j,值为 3和 5, j的值大于 i的值,因此调用函数 f以后,返回 j的地址, r指向 j,同时 i和 j的值交换, i=5, j=3, p和 q的指向不变, p指 向 i, q指向 i,选项 C正确。 【知识模块】 编译预处理和指针 20 【
23、正确答案】 C 【试题解析】 题目中函数 fun有四个形参,功能是利用参数的地址传递来计算前两个参数的和与差。主函数中调用 fun函数 c计算 4+3, d计算 43值为 1,选项C正确。 【知识模块】 编译预处理和指针 21 【正确答案】 B 【试题解析】 题目中函数 fun的主要功能是判断字符是否为大写字符,如果是则转换为小写字符,主函数读入大写字符串,转换成小写,所以输出结果应该是全部小写的字符串。 【知识模 块】 编译预处理和指针 22 【正确答案】 B 【试题解析】 在 while循环中的判断表达式为 (*x=*y)&*x! = 0所以只要字符串 x与 y的当前字符不相等时,循环就结
24、束。若 x到达字符串结尾,循环也结束。 【知识模块】 编译预处理和指针 23 【正确答案】 B 【试题解析】 题目中程序只输出字母 ASC 值为奇数的字母,注意 if(*s 2),当 *s为奇数时执行条件语句根据字母 B, y, T, E的 ASC 值的奇偶性相应输出。 【知识模块】 编译预处理和指针 24 【正确 答案】 B 【试题解析】 题目中语句 (*q)+的功能是 q所指的字符加 1,变成其后面的字符; q+就是指针 q指向下一个字符的位置。所以在主函数中,语句 p=&a3的作用是使指针 p指向字符数组 a中的第四个字符的位置,即 p指向字符 g;然后调用函数 funl(p)后,字符 g变成 h,字符 r变成 s,字符, a变成 b,字符 m变成n,因而字符数组 a中的内容就成 “Prohsbn”。 【知识模块】 编译预处理和指针 25 【正确答案】 C 【试题解析】 题目中在 while语句的条件中是把字符 *a的值赋给字符 *b,然后再判断字符 *b的值是否等于字符串的结束字符 ( 0),当不等于结束字符 ( 0)时,把字符指针变量 a, b分别加 1,指向它们的下一个字符,直到字符串 a的结束。这样程序执行的结果就是把字符串 a赋给了 b所指的存储空间,选项 C正确。 【知识模块】 编译预处理和指针