1、国家二级 C语言(编译预处理和指针)机试模拟试卷 4及答案与解析 一、选择题 1 以下叙述中正确的是 ( A)在 C语言中,预处理命令行都以 “#“开头 ( B)预处理命令行必须位于 C源程序的起始位置 ( C) #include必须放在 C程序的开头 ( D) C语言的预处理不能实现宏定义和条件编译的功能 2 有以下程序,程序运行后的输出结果是 #include stdio h #define S(x)4*(x)*x4+1 void main() int k=5, j=2; printf(“ d n“, S(k+j); ( A) 197 ( B) 143 ( C) 33 ( D) 28 3
2、有以下程序,程序运行后的输出结果是 #include stdio h #define fix)x*x*x main()int a=3, s, t; s=f(a+1); t=f(a+1); printf(“ d, d n“, s, t); ( A) 10, 10 ( B) 10, 64 ( C) 64, 10 ( D) 64, 64 4 若程序中有宏定义行: #define N 100则以下叙述中正确的是 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)上述宏定义行实现将 100赋给标示符 N ( C)在运行时用 100替换标识符 N ( D)在编译程序对 C源程序进行预处理时用
3、100替换标识符 N 5 有以下程序,程序运行后的输出结果是 #include stdio h #define SUB(X, Y)(X+1)*Y main()int a=3, b=4; printf(“ d n“, SUB(a+, b+); ( A) 20 ( B) 12 ( C) 16 ( D) 25 6 以下叙述中正确的是 ( A)在包含文件中,不得再包含其 他文件 ( B) #include命令行不能出现在程序文件的中间 ( C)在一个程序中,允许使用任意数量的 #include命令行 ( D)虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接 7 有以下程序,程序运行后
4、的输出结果是 void fun(int*p1, int*p2, int*s) s=(int*)malloc(sizeof(int); *s=*p1+*(p2+); main()int a2=1, 2, b21=10, 20, *s=a; fun(a, b, s); printf(“ d n“, *s); ( A) 10 ( B) 11 ( C) 2 ( D) 1 8 设有以下函数: void fun(int n, char*s) 则下面对函数指针的定义和赋值均正确的是 ( A) void*pf(); pf=fun; ( B) void(*pf)(int, char*); pf=fun; ( C
5、) void*pf(); *pf=fun; ( D) void(*pf)(int, char); pf=&fun; 9 以下叙述中正确的是 ( A)函数的类型不能是指针类型 ( B)函数的形参类型不能 是指针类型 ( C)基类型不同的指针变量可以相互混用 ( D)设有指针变量为 “double*p”,则 “p+1”将指针 P移动 8个字节 10 以下叙述中错误的是 ( A)函数可以返回地址值 ( B)改变函数形参的值,不会改变对应实参的值 ( C)当在程序的开头包含头文件 stdio h时,可以给指针变量赋 NULL ( D)可以给指针变量赋一个整数作为地址值 11 下面选项中的程序段,没有编
6、译错误的是 ( A) char*sp, s10; sp=“Hello“; ( B) char*sp, s10; s=“Hello“; ( C) char strl10=“computer“, str210; str2=str1; ( D) char mark1; mark=“PROGRAM“; 12 若有定义语句: int a23, *p3;则以下语句中正确的是 ( A) p0=&a12; ( B) p0=a; ( C) p=a; ( D) p1=&a; 13 以下叙述中正确的是 ( A)如果 p是指针变量,则 *p表示变量 P的地址值 ( B)如果 p是指针变量,则 &p是不合法的表达式 (
7、 C)在对指针 进行加、减算术运算时,数字 1表示 1个存储单元的长度 ( D)如果 p是指针变量,则 *p+1和 *(p+1)的效果是一样的 14 有以下程序 #include stdio h main() int n, *p=NULL; *p=&n; printf(“Input n: “); scanf(“ d“, &p); printf(“output n: “); printf(“ d n“, p); 该程序试图通过指针 p为变量 n读入数据并输出,但程序有多处错误,以下语句正确的是 ( A) int n, *p=NULL; ( B) *p=&n; ( C) scanf(“ d“, &
8、p) ( D) printf(“ d n“, p); 15 有以下程序 int fun1(double a)return a*=a; int fun2(double x, double y) double a=0, b=0; a=fun1(x); b=fun1(y); return(int)(a+b); main() double w; w=fun2(1 1, 2 0); 程序执行后输出结果是 ( A) 5 00 ( B) 5 ( C) 5 21 ( D) 0 0 16 有以下程序 #include stdio h int fun(char*s)char*p=s; while(*p!=0)p+
9、; return(p-s); main()printf(“ d n“, fun(“goodbey!“); 程序的输出结果是 ( A) 6 ( B) 8 ( C) 0 ( D) 7 17 有以下程序 #include stdio h main() void fun(char*c, int d char b=a, a=“A; *c=*c+1; d=d+1; fun(&b, a); printf(“ c, c n“, b, a); printf(“ c, c, “, *c, d); 程序运行后的输出结果是 ( A) b, B, b, A ( B) b, B, B, A ( C) a, B, B, a
10、 ( D) a, B, a, B 18 有以下程序 #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); 程序运行后的输出结果是 ( A) 2, 3 ( B) 1, 3 ( C) 1, 4 ( D) 1, 2 19 有以下程序 #include stdio h int fun(char s) main() int n=0; char s10=6, 1, *, 4, *, 9,
11、*, 0, *: while(*s =9&*s =0)printf(“ d n“, fun(s); n=10*n+*s-0; s+; return(n); 程序的运行结果是 ( A) 61490 ( B) 61 ( C) 9 ( D) 5 20 若有以下程序 #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, j9*p, *q, *r)
12、; 则程序的输出结果是 ( A) 3, 5, 5, 3, 5 ( B) 5, 3, 5, 3, 5 ( C) 5, 3, 3, 5, 5 ( D) 3, 5, 3, 5, 5 21 若有以下程序 #include stdio h int*flint*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); 则程序的输出结果是 ( A) 3, 5, 5, 3
13、, 5 ( B) 3,5, 3, 5, 5 ( C) 5, 3, 5, 3, 5 ( D) 5, 3, 3, 5, 5 22 有以下程序 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); 程序的输出结果是 ( A) 0 0 ( B) 9 9 ( C) 9 0 ( D) 0 9 23 有以下函数 int fun(char*x, char*y)int n=0; while(*x: =*y)&*x!= 0) x+; y+; n+
14、; return n; 函数的功能是 ( A)查找 x和 y所指字符串中是否有 0 ( B)统计 x和 y所指字符串中最前面连续相同的字符个数 ( C)将 y所指字符串赋给 x所指存储空间 ( D)统计 x和 y所指字符串中相同的字符个数 24 有以下程序 #include stdio h void fun(char*p) +p; printf(“ sha“, *p); main() char*a=(“Morning“, “Afternoon“, “Evening“, “Night“); fun(a); 程序的运行结果是 ( A) ftemoon ( B) Morning ( C) ornin
15、g ( D) Afternoon 25 下列函数的功能是 void fun(char*a, char*b)while(*b=*a)!= 0)a+; b+; ) ( A)使指针 b指向 a所指字符串 ( B)将 a所指字符串和 b所指字符串进行比较 ( C)将 a所指字符串赋给 b所指空间 ( D)检查 a和 b所指字符串中是否有 0 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; *p
16、2=s; p1+; p2-: main() char a=“123456“; fun(a, strlen(a); puts(a); ( A) 116611 ( B) 161616 ( C) 654321 ( D) 123456 国家二级 C语言(编译预处理和指针)机试模拟试卷 4答案与解析 一、选择题 1 【正确答案】 A 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为 “编译预处理 ”命令行。预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。 #include stdio h命令行表示程序中要引用 C标准函数库中的
17、标准输入输出函数。 【知识模块】 编译预处理和指针 2 【正确答案】 B 【试题解析】 这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏 S(x),当在主函数中用参数 k+j调用宏 S时,根据宏替换的原则,则 S(k+j)=S(5+2)=4*7*5+2+1=143。 【知识模块】 编译预处理和指针 3 【正确答案】 B 【试题解析】 根据题目中宏 f(x)的定义,运算过程应为:s=f(a+1)=a+1*a+1*a+1=a+a+a+1=10,因此最后 s的结果为 10,而t=f(a+1)=(a+1)*(a+1)*(a+1)=4*4*4=64的结果为 64。 【知识模块】 编
18、译预处理和指针 4 【正确答案】 D 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为 “编译预处理 ”。其含义 是在 c编译程序对 c源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。由 #define定义的宏就是编译预处理命令。 C程序在进行编译之前,都要先对程序中所有出现的 “宏名 ”,都用宏定义中的替换文本进行替换。 【知识模块】 编译预处理和指针 5 【正确答案】 C 【试题解析】 宏展开的结果 (a+1)*b+,后缀自加表达式参加运算,先用 a和b的初值得到表达式的值,进行计算,然后 a和 b在自加。因此计算结果为 16。 【知识模块】 编译预处理和
19、指针 6 【正确答案】 C 【试题解析】 #include文件包含命令,使用时应注意以下 5个规则: 包含文件的 #include命令行通常应书写在所用源程序文件的开头,故有时也把包含文件称作 “头文件 ”。头文件名可以由用户指定,其后缀不一定用 “ h”; 包含文件中,一般包含有一些公用的 #define命令行、外部说明或对 (库 )函数的原型说明; 当包含文件修改后,对包含该文件的源程序必须重新进行编译连接: 在一个程序中,允许有任意多个 #include命令行; 在包含文件中还可以包含其他文件。 【知识模块】 编译预处理和指 针 7 【正确答案】 D 【试题解析】 主函数中定义指针 s指
20、向数组 a,调用 fun函数,首先是实参传给形参,因此 p1指向 a, p2指向 b, s指向 a,即 *s的值为 1。流程到调用函数 fun执行,首先更改 s的指向为新分空间的首地址,表达式 !s=*p1+*(p2+),取 p!指向数据位 1,加上 p2指向数据 10, p2后移,存放到 s指向的空间中 11流程结束,形参 s和 p1, p2撤销,存入 s指向空间的数据丢失,主函数输出 s指向数据仍然是 1。 【知识模块】 编译预处理和指针 8 【正确答案】 B 【试 题解析】 函数指针的定义形式是:数据类型标识符 (*指针变量名 )():void(*pf)()定义了一个没有返回值的函数指针
21、 pf,在给函数指针变量赋值时,只需给出函数名而不必给出参数。所以给 pf给赋值时,把函数名 fun赋给 pf即可。 【知识模块】 编译预处理和指针 9 【正确答案】 D 【试题解析】 在对指针进行加、减算术运算时,数字 1表示 1个存储单元的长度,而 double类型数据在内存中占 8个字节,因此移动一次移动 8个字节。其他三个都不正确, 【知识模块】 编译预处理和指针 10 【 正确答案】 D 【试题解析】 指针变量的值只能是存储单元地址,而不能是一个整数,选项 D)的描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分别占用不同的内存单元,改变形参的值不会改变对应实参
22、的值,在头文件stdio h中, NULL被定义为 void型的指针。 【知识模块】 编译预处理和指针 11 【正确答案】 A 【试题解析】 选项 B)中数组名为常量,不能赋值,选项 C)字符数组之间无法完成赋值操作,选项 D)和选项 B)相同,无法对数组进行赋值。 【知识模块】 编 译预处理和指针 12 【正确答案】 A 【试题解析】 定义语句 “int a23, *p3; ”定义了整型二维数组 a23和指针数组 p3。在 C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数组中第一行的地址。所以选项 A)中,把整型数组 a0的指针赋给 p0。 【知识模块】 编译预处理和指针 13
23、【正确答案】 C 【试题解析】 移动指针是对指针变量加上或减去一个整数或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时 ,指针的移动才有意义。当指针指向一串连续的存储单元时,可以对指针变量进行加上或减去一个整数的运算,也可以对指向同一串连续存储单元的两个指针进行相减的运算。除此之外。不可以对指针进行任何其他的算术运算。 C语言提供了一个间接访问运算符 (*),又称间址运算符,它是一个单目运算符,优先级比较高,高于普通的算 *运算符,但是低于 ()运算符,因此 *p+1和 9(p+1)的含义是不一样。当指针变量中存放了一个确切的地址值时,就可以用 “间接访问
24、运算符 ”通过指针来引用该地址的存储单元。 【知识模块】 编译预处理和指针 14 【正确答案】 A 【试题解析】 选项 A)表示在程序中,声明定义变量语句 “int n, *p=NULL; ”定义了整型变量 n和指针变量 p,并且指针变量 p初始化为空。其他的语句都是错误的。其中选项 B), &n的地址应存放到指针变量 p中,而选项 C)中数据输入项错误,选项 D)输出地址信息。 【知识模块】 编译预处理和指针 15 【正确答案】 A 【试题解析】 子函数 fun(doubk a)的功能是返回 a的平方值的整数部分。子函数fun2(doubk x, double v)的功能是返回 x的平方值
25、的整数部分与 y的平方值的整数部分的和。又因为题中变量 w的定义为 double型,函数 fun(2)的定义为 int型,按照各类数值型数据间的混合运算,整型数据被转换为实型数据。所以双精度型变量 w的值为 5 00。 【知识模块】 编译预处理和指针 16 【正确答案】 B 【试题解析】 函数 fun的主要功能是计算字符串中实际字符的个数,因此“goodbey!“含有字符为 8,返回值为 8。 【知识模块】 编译预处理和指针 17 【正确答案】 A 【试题解析】 本题中 fun函数的参数传递方式, 形参 c是传地址,形参 d是传值,所以在主函数中,执行 fun时,把变量 b的地址传给了 c,把
26、 a的值传递给了d,经过运算,输出的值为 b, B。在主函数的输出语句中,输出变量 b的值为 b,变量 a的值为 A。 【知识模块】 编译预处理和指针 18 【正确答案】 B 【试题解析】 本题考查函数的调用与指针。 fun()函数的作用是:使指针 p指向原来所指变量的下一个变量,使 q指针指向的值加 1。主函数中,指针 r指向 m,调用 fun()函数的结果是,使 r指向地址位于 m后面的变量,使位于 n的地址上的变量 (就是 n)的值加 1, 因此,结果为 1, 3。 【知识模块】 编译预处理和指针 19 【正确答案】 B 【试题解析】 在 fun函数中, wbile循环的功能是逐个取字符
27、数组 s的字符判断其是否是数字。若是则将这些数字组成一个数保存到变量 n中。并返回变量 n的值。所以在主函数中调用 fun(s)时,将把字符数组 s中的数字组成一个数输出。因为当指针 s指向数组的第 3位时,即字符 *,循环条件不成立,循环结束,返回 n的值。所以输出 n的值为 61。 【知识模块】 编译预处理和指针 20 【正确答案】 D 【试题解析】 本题考查了返回值为指针的函数,函数 f的主要功能为第一个参数小于第二个参数,那么交换指针的指向,这对于实参指向的数据时没有影响的。最后返回比较大的元素的地址。主函数中 p指向 i, q指向 j,调用 r=f(p, q)。返回 q的地址,因此
28、*p=3, *q=5, *r=5。 【知识模块】 编译预处理和指针 21 【正确答案】 C 【试题解析】 函数 f为返回值为指针的函数,主要功能是返回 s和 t指向空间值大的数据的地址,同时如何 s指向空间数据大于 t指向空间的数据,那么交换。主函数 p和 q指向 i和 j,值为 3和 5, j的值 大于 i的值,因此调用函数 f以后,返回 i的地址, r指向 j,同时 i和 i的值交换, i=5, i=3, p和 q的指向不变, p指向i, q指向 j。 【知识模块】 编译预处理和指针 22 【正确答案】 B 【试题解析】 函数。 fun的主要功能是交换 p和 q指向的地址空间的数据,然后更
29、改 p的指向的地址空间数据,使之和 q指向的数据相同。主函数调用 fun后, p指向 a, q指向 b,因此 a和 b的数据全部为 9。 【知识模块】 编译预处理和指针 23 【正确答案】 B 【试题解析】 在 while循环中的判断表达 式为 (*x=*y)&*x!= 0,所以只要字符串 x与 y的当前字符不相等时,循环就结束。 【知识模块】 编译预处理和指针 24 【正确答案】 D 【试题解析】 在程序中,指针的指针变量 a和 p都是指向字符串的指针。执行fun(a)语句时, p指向的是字符串数组 a的第一个字符串 “Morning”, p自加 1之后, *p指向了字符串数组 a的第 2个
30、字符串 “Afternoon”。 【知识模块】 编译预处理和指针 25 【正确答案】 C 【试题解析】 在 while语句的条件中是把字符 *a的值赋给字符 *b,然后再判断字符 *b的值是否等于字符串的结束字符 ( 0),当不等于结束字符 ( 0)时,把字符指针变量 a, b分别加 1,指它们的下一个字符,直到字符串 a的结束。这样程序执行的结果就是把字符串 a赋给了 b所指的存储空间。 【知识模块】 编译预处理和指针 26 【正确答案】 C 【试题解析】 函数 fun的功能是将字符串 w中的元素从大到小进行排列,所以在主函数中调用函数 fun后,字符串 a的元素从大到小进行了排列。 【知识模块】 编译预处理和指针