1、国家二级 C语言(编译预处理和指针)机试模拟试卷 5及答案与解析 一、选择题 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) 31 5 ( B) 7 5 ( C)程序有错无输出结果 ( D) 14 0 2 设有宏定义: #define IsDIV(k, n)(k n=1)?1: 0)且变量 m已正确定义并赋值,则宏调用: IsDIV(m, 5)&lsDIV(m, 7)为真时所要表达的是 ( A)判断 m是否能被 5和 7整除 (
2、B)判断 m被 5或者 7整除是否余 1 ( C)判断 m被 5和 7整除是否都余 1 ( D)判断 m是否能被 5或者 7整除 3 有下列程序,程序的运行结果是 #include stdio h #define N 5 #define M N+1 #define f(x)(x*M) main() int i1, i2; i1=f(2); i2=f(1+1); printf(“ d d n“, i1, i2); ( A) 12 7 ( B) 12 12 ( C) 11 11 ( D) 11 7 4 若有以下程序,则程序的输出结果是 #define S(x)x*x #define T(x)S(x
3、)*S(x) main()int k=5, j=2; printf(“ d, d n“, S(k+j), T(k+j); ( A) 17, 37 ( B) 49, 2401 ( C) 17, 289 ( D) 49, 289 5 下面选项中关于编译预处理的叙述正确的是 ( A)凡是以 #号开头的行,都被称为编译预处理命令行 ( B)预处理命令行必须使用分号结尾 ( C)预处理命令行 不能出现在程序的最后一行 ( D)预处理命令行的作用域是到最近的函数结束处 6 有以下程序,程序的运行结果是 #include stdio h #include stdlib h int fun(int n) ma
4、in() int*p; int a; p=(int*)malloc(sizeof(int); a=fun(10); *p=n; return*p; printf(“ d n“, a+fun(10); ( A) 10 ( B) 20 ( C) 0 ( D)出错 7 有以下 程序段 int*p; p=_malloc(sizeof(int);若要求使 P指向一个 int型的动态存储单元,在横线处应填入的是 ( A) (int*) ( B) int ( C) int* ( D) (*int) 8 设有定义语句 int(*f)(int);则以下叙述正确的是 ( A) f是基类型为 int的指针变量 (
5、B) f是指向 int类型一维数组的指针变量 ( C) f是指向函数的指针变量,该函数具有一个 int类型的形参 ( D) f是函数名,该函数的返回值是基类型为 int类型的地址 9 设有某函数的 说明为 int*func(int a10, int n);则下列叙述中,正确的是 ( A)说明中的 a10写成 a或 *a效果完全一样 ( B)形参 a对应的实参只能是数组名 ( C) func的函数体中不能对 a进行移动指针 (如 a+)的操作 ( D)只有指向 10个整数内存单元的指针,才能作为实参传给 a 10 设已有定义: float x;则以下对指针变量 p进行定义且赋初值的语句中正确的是
6、 ( A) int*p=(float)x; ( B) float*p=&x; ( C) float p=&x; ( D) float*p=1024; 11 设有定义 double a10, *s=a;以下能够代表数组元素 a3的是 ( A) (*s)3 ( B) *s3 ( C) *s+3 ( D) *(s+3) 12 若有定义语句: int year=2009, *p=&year;以下不能使变量 year中的值增至2010的语句是 ( A) (*p)+; ( B) +(*p); ( C) *p+; ( D) *p+=1; 13 有以下程序 (注:字符 a的 ASCII码值为 97) main
7、()char*s=“abc“; doprintf(“ d“, *s 10); +s; while(*s); 程序运行后的输出结果是 ( A) abc ( B) 7890 ( C) 979899 ( D) 789 14 若有定义语句: double a, *p=&a;以下叙述中错误的是 ( A)定义语句中的 *号是一个说明符 ( B)定义语句中的 p只能存放 double类型变量的地址 ( C)定义语句中, *p=&a把变量 a的地址作为初值赋给指针变量 p ( D)定义语句中的 *号是一个间址运算符 15 有以下程序 void fun(char*s)char a10; main()char*p
8、=“PROGRAM“; strcpy(a, “STRING“); fun(p); sa; printf(“ s n“, p); 程序运行后的输出结果是 (此处 代表空格 ) ( A) STRING ( B) PROGRAM ( C) STRING ( D) STRING 16 有以下程序 #include stdio h main() #define N 4 int xN=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, void fun(int aN, int b) yN, i; int i; fun(x, y); for(i=0; i N; i+)bi=aii; for(i=0
9、; i N; i+)printf(“ d, “, yi); )printf(“kn“); 程序的运行结果是 ( A) 1, 2, 3, 4, ( B) 1, 4, 5, 9, ( C) 1, 0, 7, 0, ( D) 3, 4, 8, 10, 17 以 F函数按每行 8个输出数组中的数据: void fun(int*w, int n) int i; for(i=0: i n; i+) _ printf(“ d“, wi); printf(“ n“); 下划线处应填入的语句是 ( A) if(i 8=0)printf(“ n“); ( B) if(i 8=0)continue; ( C) if
10、(i 8=0)printf(“ n“); ( D) if(i 8=0)continue; 18 有以下程序 #include stdio h main() void fun(int*a, int*b) int x=3, y5, *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); 程序运行后的输出结果是 ( A) 3, 5, 5, 3 ( B) 3, 5, 3, 5 ( C) 5, 3, 3, 5 ( D) 5, 3, 5
11、, 3 19 若有以下程序 #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); 则程序的输出结果是 ( A) 4, 3, 4 ( B) 4, 3, 3 ( C) 6, 3, 6 ( D) 6, 6, 6 20 若有以下程序 #3include stdio_h main()int k=3; void sp(int*a)int b=2; sp(&k); *a=*a*2; printf(“ d n“
12、, k); printf(“ d, “, *a); a=&b; *a=*a*2; printf(“ d, “, *a); 则程序的输出结果是 ( A) 6, 4, 6 ( B) 6, 4, 3 ( C) 6, 12, 12 ( D) 9, 4, 9 21 有以下程序 #include stdio h int funa(int a, int b)retum a+b; int funb(int a, int b)return a-b; int sss(int(*t)(), int x, int y)retum(*t)(x, y); main()int x; X=SSS(funa, 9, 3); x
13、+=sss(funb, 8, 3); printf(“ d n“, x); 程序运行后的输出结果是 ( A) 17 ( B) 23 ( C) 24 ( D) 22 22 有以下程序 char fun(char*c)if(*c =Z&*c =A) *c-=A-a; return*c; main()char s81, *p=s; gets(s); while(*p) *p=fun(P); putchar(*p); p+; ) printf(“ n“); 若运行时从键盘上输入 OPEN THE DOOR,程 序的输出结果是 ( A) OPEN tHE dOOR ( B) open the door
14、( C) OPEN THE DOOR ( D) Open The Door 23 有以下函数 int fun(char*s)char*t=s; while(*t+); return(t-s); 该函数的功能是 ( A)比较两个字符串的大小 ( B)计算 s所指字符串的长度 ( C)计算 s所指字符串占用内存字节的个数 ( D)将 s所指字符串复制到字符串 t中 24 有以下程序 void fun1(char*p) main() char*q; char a=“Program“, *p; q=p; p=&a3; fun1(p); printf(“ s n“, a); while(*q!= 0)
15、(*q)+; q+; 程序执行后的输出结果是 ( A) Prphsbn ( B) Prohsbn ( C) Progsbn ( D) Program 25 有以下程序 #include stdio h #include string h void fun(char s10, int n) char t; int i, j; for(i=0; i n-1; i+) for(j=i+1; j n; j+) if(si0 sj0)t=si0; si0=sj0; sj0=t; main() char ss510=“bcc“, “bbcc“, “xy“, “aaaacc“, “aabcc“; fun(s
16、s, 5 ( A) aaaacc, xy ( B) bcc, aabcc ( C) xy, aaaacc ( D) aabcc, bcc 26 有以下程序: #include stdio h int b=2; int fun(int*k) b=*k+b; return(b); main() int a10=1, 2, 3, 4, 5, 6, 7, 8, i; for(i=2; i 4; i+)b=fun(&ai)+b; printf(“ d“, b); printf(“ n“); 程序运行后的输出结果是 ( A) 8 10 ( B) 10 28 ( C) 10 12 ( D) 10 16 国家
17、二级 C语言(编译预处理和指针)机试模拟试卷 5答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话 S(a+b)=PT*a+b*a+b=3 5*1+2*1+2=7 5。 【知识模块】 编译预处理和指针 2 【正确答案】 C 【试题解析】 本题考查宏定义和三目运算符。三目运算符的格式为: test?语句1:语句 2 其中, test可以是任何 Boolean表达式。语句 1,当 test是 true时执行该语句,可以是复合语句;语句 2,当 test是 false时执行该语句,可以是复合语句。isDIV(k, n)
18、要表达的是当 k除 n的余数是 1时表达式的值为 1,否则为 0,所以题中要表达的是 m被 5和 7整除是否都余 1。 【知识模块】 编译预处理和指针 3 【正确答案】 D 【试题解析】 在本题中,定义了 3个宏定义语句,分别是: #defineN5、 #define M N+5和 #define f(x)(x*M),所以根据 C语言的宏替换规则,我们可知,f(2)=2*N+1=2*5+1=11, f(1+1)=1+1*N+1=1+1*5+1=7。 【知识模块】 编译预处理和指针 4 【正确答案】 A 【试题解析】 本题考查了宏替换,宏替换就是简单的字符替换,不会进行语法错误检查也不会进行运算
19、。 “s(k+j)”宏展开以后为 “k+i*k+j”,值为 17, “T(k+j)”宏展开以后为 “k+i*k+j*k+i*k+i”,值为 37。 【知识模块】 编译预处理和指针 5 【正确答案】 A 【试题解析】 在 C语言中,凡是以 “#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以 “#”号开始,每行的末尾不能用 “; ”号结束。以区别于 C语句、定义和说明语句。根 据需要,命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。 【知识模块】 编译预处理和指针 6 【正确答案】 B 【试题解析】 函数 fun(int n)的功能
20、是在内存中每次动态的申请一个整型变量的存储空间,把整型变量 n的值存入这个存储空间中。所以当在主函数中执行输出语句时, a+fun(10)的值等于 20。 【知识模块】 编译预处理和指针 7 【正确答案】 A 【试题解析】 ANSIC标准规定 malloc函数返回值的类型为 void*。使用形式为: malloc(size),其中 size的类型为 unsigned int。 malloc函数用来分配 size个字节的存储区,返回一个指向存储区首地址的基类型为 void的地址。若没有足够的内存单元供分配,函数返回空 (NULL)。可以通过强制类型转换将返回值转换为需要类型的地址。 【知识模块】
21、 编译预处理和指针 8 【正确答案】 C 【试题解析】 定义语句 int(*f)(int)中 f是指向函数的指针变量,该函数中也只有一个 int型的形参。 【知识模块】 编译预处理和指针 9 【正确答案】 A 【试题解析】 函数: func为返回值为指针的函数,有两个形参,形参数组 a为指针变量,保存实参数组的首地址,其元素个数由实参数组决定,因此说明中的a10写成 a或 *a效果完全一样。 【知识模块】 编译预处理和指针 10 【正确答案】 B 【试题解析】 定义指针变量的一般形式为:类型名 *指针变量名 1, *指针变量名2, ;对一个指针变量赋值要通过求地址运算符 (&)获得变量的地址值
22、,然后把此地址值赋给指针变量。因而在选项 A)的表达式中。赋值号的左边表示定义了指针变量口,而右边表示求变量 x的地 址值。 【知识模块】 编译预处理和指针 11 【正确答案】 D 【试题解析】 语句 *s=a,使用指针变量 s指向一维数组 a的首地址,所以 *(s+3)表示的是引用数组 a3。 【知识模块】 编译预处理和指针 12 【正确答案】 C 【试题解析】 由于自加运算符 +的运算级高于间接运算 *的运算级,所以选项 A)的表达式 *p+不能使变量 year中的值增至 2010。 【知识模块】 编译预处理和指针 13 【正确答案】 D 【试题解析】 因为小写字符 a, b, c的 AS
23、CII的值分别为 97, 98, 99,而在 do while循环语句中,每次对字符的 ASCII的值取余数并输出,第一次循环输出 7,第二次循环输出 8,第三次循环输出 9。 【知识模块】 编译预处理和指针 14 【正确答案】 D 【试题解析】 在指针定义语句 “double a, *p=&a”中,指针变量 p前面的 *号,只是一个说明符,说明变量 p是指针类型的变量。 【知识模块】 编译预处理和指针 15 【正确答案】 B 【试题解析】 函数 fun的主要功能是把字符串 “STRING“,存放到字符数组 a中, s指向该字符串,函数调用结束以后,释放 s和 a指向的空间。主函数调用fun(
24、p),并不能更改 p的值。因此 p的指向没有改变。 【知识模块】 编译预处理和指针 16 【正确答案】 C 【试题解析】 函数矗 m(int aN, int b)的功能是把矩阵 aNN主对角线上的元素赋给一维数组 b。在主函数中由 xN的初始化可知,其主对角线上的元素是 1, 0, 7, 0。所以当执行完函数 fun(x, y)后,一维数组元素 y中的元素值为1, 0, 7, 0。 【知识模块】 编译预处理 和指针 17 【正确答案】 A 【试题解析】 本题考查判断语句与循环语句。欲使每行输出 8个数据,则必然使用取余运算,当 i 8=0时先输出一个换行符再输出字符。选项 D)中, comti
25、nue语句的作用是停止执行本次循环位于 continue后面的语句,而进入下一次循环。 【知识模块】 编译预处理和指针 18 【正确答案】 B 【试题解析】 本题考查函数的调用与指针。 D和 q分别为指向 x和 y的指针,函数 fun()的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能 返回主函数。而主函数中, fun(p, q)、 fun(&x, &y)的实参均为 x与 y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。 【知识模块】 编译预处理和指针 19 【正确答案】 B 【试题解析】 主函数中定义指针变量 p指向 k,调用函数 sp(p),将 k
26、的地址传递给形参指针 a,函数转到 sp运行, a指向 b的地址,表达式 *a=*a+2,相当于b=b*2,得到 *a的数据 4输出。函数调用结束,此时 a和 b的空间撤销,而对实参k和 p的值并没有改变,仍旧是 3。 【知识模块】 编译预处理和指针 20 【正确答案】 A 【试题解析】 本题考查了指针作为函数的参数,可以接收实参变量的地址,改变实参的值。主函数调用 sp(&k),执行 sp函数 a指向向 k,执行语句 *a=*a*2后 a指向空间的值 k的值为 6,改变 a的指向以后,此时 a指向 b,则执行 *a=*a*2以后, a指向空间 b的值为 4。调用结束返回主函数输出 k的值为
27、6。 【知识模块】 编译预处理和指针 21 【正确答案】 A 【试题解析】 函数 funa的功能计算两个数据的和, funb的功能计算两个数据的差,函数 sss中利用指向函数 的指针作为函数的参数,可以在调用的时候,根据接收的函数地址来决定调用那一个函数。主函数中调用 x=sss(funa, 9, 3),将 funa函数的地址传递给 t,因此 sss函数成为求两个数据的和 12,继续将 funb函数地址传给 t,求两个数据差为 5,和 s累加后结果为 17。 【知识模块】 编译预处理和指针 22 【正确答案】 B 【试题解析】 函数 fun的主要功能是判断字符是否为大写字符,如果是则转换为小写
28、字符,主函数读入大写字符串,转换成小写。 【知识模块】 编译预处理和指针 23 【正确答 案】 C 【试题解析】 在函数 fun(char*s)中,首先用字符指针变量 t指向 s,而循环语句while(*t+);的功能是使指针变量 t指向字符串变量 s的末尾,这时退出循环,因而语句 return(t-s);返回的就是字符串 s所指字符串的长度。 【知识模块】 编译预处理和指针 24 【正确答案】 B 【试题解析】 在函数 void funl(char*p)中,语句 (*q)+的功能是 q所指的字符加1,变成其后面的字符: q+就是指针 q指向下一个字符的位置。所以在主函数中。语句 p=&a3的
29、作用是使指针 p指向字符数组 a中的第四个字符的位置,即D指向字符 g:然后调用函数 fun1(p)后,字符 g变成 h,字符 r变成 s,字符 a变成 b,字符 m变成 n,因而字符数组 a中的内容就成 “Prohshn”。 【知识模块】 编译预处理和指针 25 【正确答案】 C 【试题解析】 函数 fun(char s10, int n)通过两重 for循环语句,比较二维字符数组 s10的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符 ,则交换这两个字符串的首字符。在主函数中,语句 fun(ss, 5)的作用是对二维字符数组 ss510的 5个字符串的首字符进行从小到大的排序,不影响各个字符串另外的字符。所以排序结束后, 5个字符串的第一个字符依次变为a、 a、 b、 b和 x;最后输出第 1个和第 4个字符串。 【知识模块】 编译预处理和指针 26 【正确答案】 B 【试题解析】 i=2时, fua(&a2)返回值是 b=b+a1=2+3=5, b=b+b=5+5=10:i=3时, fun(&a3)返回值是 b=b+a3=10+4=14, b=b+b=14+14=28。 【知识模块】 编译预处理和指针