[计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc

上传人:Iclinic170 文档编号:498995 上传时间:2018-11-30 格式:DOC 页数:18 大小:49.50KB
下载 相关 举报
[计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc_第1页
第1页 / 共18页
[计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc_第2页
第2页 / 共18页
[计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc_第3页
第3页 / 共18页
[计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc_第4页
第4页 / 共18页
[计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、国家二级 C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析 一、选择题 1 有以下程序: #include stdio h voidf(int*p, int*q); main() int m=1, n=2, *r=&m; f(r, &n); printf(“ d, d“, m, n); voidf(int*p, int*q) p=p+1: *q=*q+1: 程序的运行结果是 ( )。 ( A) 2, 3 ( B) 1, 3 ( C) 1, 4 ( D) 1, 2 2 设已有定义 float x;,则下列对指针变量 p进行定义且赋初值的语句中正确的是( )。 ( A) int*

2、p=(float)x; ( B) float*p=&x; ( C) float p=&x; ( D) float*p=1024; 3 若有定义语句 double a, *p=&a;,下列叙述中错误的是 ( )。 ( A)定义语句中的 *号是一个间址运算符 ( B)定义语句中的 *号是一个说明符 ( C)定义语句中的 p只能存放 double类型变量的地址 ( D)定义语句中, *p=&a把变量 a的地址作为初值赋给指针变量 P 4 有以下程序: #include stdio h main() int a=1, b=3, C=5; int*p1=&a, *p2=&b, *p=&c; *p=*p1

3、*(*p2); printf(“ d n“, c); 程序的运行结果是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 5 有以下程序: #include stdio h main() int n, *p=NULL; *p=&n: printf(“Input n: “); seanf(“ d“, &p); printf(“output n: “); printf(“ d n“, p); 该程序试图通过指针 p为变量 n读入数据并输出,但程序有多处错误,下列语句中正确的是 ( )。 ( A) int n, *p=NULL; ( B) *p=&n; ( C) scanf(“ d“

4、, &p) ( D) printf(“ d n“, p); 6 若有定义语句 double x, y, *px, *py;,执行了 px=&x; py=&y;之后,正确的输入语句是 ( )。 ( A) seanf(“ If le“, px, py); ( B) seanf(“ f f“&x, &y); ( C) sccanf(“ f f“, x, y); ( D) scanf(“ If If“, x, y); 7 下列程序段中完全正确的是 ( )。 ( A) int*p; scanf(“ d“, &p); ( B) int*p; scanf(“ d“, p); ( C) int k, *p=&

5、k; scanf(“ d“, p); ( D) int k, *p; *p=&k; scanf(“ d“, p); 8 若有定义语句 int a23, *p3;,则以下语句中正确的是 ( )。 ( A) p=a; ( B) p0=a; ( C) p0=&a12; ( D) p1=&a; 9 设有以下函数: void fun(int n, char*s) ,则下列对函数指针的定义和赋值均正确的是 ( )。 ( A) void(*pf)(int, char); pf=&fun; ( B) void*pf(); pf=fun; ( C) void*pf(); *pf=fun; ( D) void(*

6、pf)(int, char*); pf=fun; 10 下列函数的功能是 ( )。 void fun(char*a, char, *b) while(*b=*a)!= 0)a+; b+; ( A)将 a所指字符串赋给 b所指空间 ( B)使指针 b指向 a所指字符串 ( C)将 a所指字符串和 b所指字符串进行比较 ( D)检查 a和 b所指字符串中是否有 0 11 有以下程序: #inelude stdio h #define N4 void fun(int aN, int b) int i; for(i=0; i N; i+)bi=aii-aiN-1-i; main() int xNN=1

7、, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,16, YN, i; fun(x, y); for(i=0; i N; i+) printf(“ d, “, yi); printf(“ n“); 程序的运行结果是 ( )。 ( A) -3, -1, 1, 3, ( B) -12, -3, 0, 0, ( C) 0, 1, 2, 3, ( D) -3, -3, -3, -3, 12 有以下程序: #include stdio h #include string h main() char str20=“One*Wodd“, “One*Dream!

8、“, *p=str1; printf(“ d, “, strlen(p); printf(“ s n“, p); 程序的运行结果是 ( )。 ( A) 10, One*Dream! ( B) 9, One*Dream! ( C) 9, One*World ( D) 10, One*World 13 若有定义 int w35;,则以下不能正确表示该数组元素的表达式是 ( )。 ( A) *(&w00+1) ( B) *(*w+3) ( C) *(*(W+1) ( D) *(W+1)4 14 下列语句组中正确的是 ( )。 ( A) char*s; s=“Olympic“; ( B) char s

9、7; s=“Olympic“; ( C) char*s; s=“Olympic“; ( D) char s7; s=“Olympic“; 15 有以下程序 (注:字符 a的 ASCII码值为 97): #include stdio h main() char*s=“abc“; do printf(“ d“, *s 10); +s; while(*s); 程序的运行结果是 ( )。 ( A) 789 ( B) abe ( C) 7890 ( D) 979899 16 设有定义 “char*c; ”,以下选项中能够使 c正确指向一个字符串的是 ( )。 ( A) char str=“string“

10、; c=str; ( B) scanf(“ s“, c); ( C) c=getchar(); ( D) *c=“string“; 17 有以下函数: int fun(char*x, char*y) int n=0; while(*x=*y)&*x!= 0) x+; y+; n+: return n: 函数的功能是 ( )。 ( A)将 y所指字符串赋给 x所指存储空间 ( B)查找 x和 y所指字符串中是否有 0 ( C)统计 x和 y所指字符串中最前面连续相同的字符个数 ( D)统计 x和 y所指字符串中相同的字符个数 18 下列语句组中正确的是 ( )。 ( A) char*s; s=“

11、BOOK!“; ( B) char*s; s=“BOOK!“; ( C) char*s10; s=“BOOK!“; ( D) char s; s=“BOOK!“; 19 设有定义语句 “int(*f)(int); ”则下列叙述中正确的是 ( )。 ( A) f是基类型为 int的指针变量 ( B) f是指向函数的指针变量,该函数具有一个 int类型的形参 ( C) f是指向 int类型一维数组的指针变量 ( D) f是函数名,该函数的返回值是基类型为 int类型的地址 20 有以下程序: #include stdio h int add(int a, int b) return(a+b); m

12、ain() int k, (*f)(), a=5, b=10; f=add; 则以下函数调用语句错误的是 ( )。 ( A) k=f(a, b); ( B) k=add(a, b); ( C) k=(*f)(a, b); ( D) k=*f(a, b); 21 下列语句中存在语法错误的是 ( )。 ( A) char ss620; ss1=“right?“; ( B) char ss20=“right?“; ( C) char*ss6; ss1=“right?“; ( D) char*ss=“right?“; 22 下列叙述中正确的是 ( )。 ( A)在 C语言中,预处理命令行都以 “#”开

13、头 ( B)预处理命令行必须位于 C源程序的起始位置 ( C) #include stdio h必须放在 C程序的开头 ( D) C语言的预处理不能实现宏定义和条件编译的功能 23 下列关于宏的叙述中正确的是 ( )。 ( A)宏替换没有数据类型限制 ( B)宏定义必须位于源程序中所有语句之前 ( C)宏名必须用大写字母表示 ( D)宏调用比函数调用耗费时间 24 有以下程序: #include stdio h #define PT3 5: #define S(x)PT*x*x; main() int a=1, b=2; printf(“ 4 1f n“, S(a+b); 程序的运行结果是 (

14、 )。 ( A) 7 5 ( B) 31 5 ( C)程序有错无输出结果 ( D) 14 0 25 若程序中有宏定义行: #define N100,则下列叙述中正确的是 ( )。 ( A)宏定义行中定义了标识符 N的值为整数 100 ( B)在编译程序对 C源程序进行预处理时用 100替换标识符 N ( C)上述宏定义行实现将 100赋给标识符 N ( D)在运行时用 100替换标识符 N 26 有以下程序: #include stdio h #define S(x)4*(x)*x+1 main() int k=5, j=2; printf(“ d n“, S(k+j); 程序的运行结果是 (

15、 )。 ( A) 33 ( B) 197 ( C) 143 ( D) 28 27 有以下程序: #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) 0 ( B) -12 ( C) -20 ( D) 10 28 下列叙述中错误的是 ( )。 ( A) C程序对预处理命令行的处理是在程序执行过程中进行的 ( B)预处理命令行的最后不能以分号表示结束 ( C) #define MAX是合法的宏定义命令行 ( D)在程

16、序中,凡是以 “#”开始的语句行都是预处理命令行 国家二级 C语言(指针、编译预处理和动态存储分配)机试模拟试卷2答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 在 f(int*p, int*q)函数中,执行 p=p+1是将 p所对应的地址加 1,而 *q=*q+1是将 q所指向 n的地址所对应的值加 1,所以 m的值所对应的值没有变,而 n的值则为 3了,因此 B选项正确。 【知识模块】 指针 2 【正确答案】 B 【试题解析】 指针是用来存放地址的变量,用 (类型名 *指针变量名 )的形式定义。赋值时应将某个变量地址即 &x赋给指针变量,所以选择 B。 【知识模块】 指针 3

17、【正确答案】 A 【试题解析】 在变量定义 double a, *p=&a;中,水号是一个指针运算符,而非间址运算符,所以 A错误。 【知识模块】 指针 4 【正确答案】 C 【试题解析】 该程序中 int*p1=&a, *p2=&b, *p=&c;指定义 3个指针变量,并赋值,即使 p1指向 a; p2指向 b; p指向 c。 *p=*p1*(*p2);语句是给 p所指的存储单元 c赋值,就是 p1所指的存储单元的值,即 a的值,与 p2所指的存储单元 b的值相乘,也就是 c=a*b,等价于 c=1*3=3,因此 C选项正确。 【知识模块】 指针 5 【正确答案】 A 【试题解析】 B选项的

18、正确写法应为 p=&n; C选项的正确写法应为 scanf(“d“, p);选项 D的正确写法应为 printf(“ d n“, *p)。 【知识模块】 指针 6 【正确答案】 A 【试题解析】 因为 x和 y都是 double型数据,所以输入时的格式字符应为 lf,所以 B、 C选项错误。 D选项中的 scanf(“ lf lf|, x, y);应为 scanf(“ lflf“, &x, &y);。 【知识模块】 指针 7 【正确答案】 C 【试题解析】 A选项中错在没有对指针进 行初始化,无效指针,并且在scanf(“ d“, &p)中无须再进行取地址操作; B选项中没有对指针进行初始化,

19、无效指针; D选项中语句 *p=&k;的左端 *p是指针所指内存空间的值, &k是地址,应为 p=&k。 C选项正确。 【知识模块】 指针 8 【正确答案】 C 【试题解析】 A选项错误,因为 p是指向一个指针数组,作为数组名,不能指向别的地方。 B选项错误,因为 p0是一个 int指针,也就是 int*;而 a是一个指向指针的指针 int*。 C选项正确,因为 p0是一个 int*, a12是 int, &a12是int*,类型吻合。 D选项错误,因为 a作为数组名,不能取地址,即使能取, p1是 int*, &a是 int*,类型不对。 【知识模块】 指针 9 【正确答案】 D 【试题解析

20、】 函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。函数名代表函数的入口地址,指向函数的指针应该定义为void(*pf)()。如果定义为 void*pf(),则表示函数 pf的返回值是一个基类型为 void的指针,因此 D选项正确。 【知识模块】 指针 10 【正确答案】 A 【试题解析】 while循环条件为: (*b=*a)!= 0,执行时先把指针 a所指向的字符赋给指针 b所在的内存单元,如果该字符不是结束标识 “ 0”,执行循环体“a+; b+; ”,指针 a、 b分别指向下一个字符单元。再判断循环条件,如果成立,继续把指针 a所指向的字符赋给指针 b所在的内存

21、单元,直到遇到结束标识为止,因此 A选项正确。 【知识模块】 指针 11 【正确答案】 A 【试题解析】 本题由 fun函数可知, b0=a00-a03=1-4=-3, b1=a11-12=6-7=-1, b2=a22-21=11-10=1, b3=a33-31=16-13=3,所以主函数中打印 y数组元素的值为 A选项。 【知识模块】 指针 12 【正确答案】 A 【试题解析】 p是指向二维字符数组第二行 One*Dream!的数组指针,所以长度是 10,打印输出的也是该字符串。 【知识模块】 指针 13 【正确答案】 D 【试题解析】 A选项中 *(&w00+1)表示 w01; B选项中

22、*(*w+3)表示w03; C选项中 *(*(w+1)表示 w10;而 D选项中 *(w+1)4的正确写法是(*w+1)4,表示 w14,因此选择 D选项。 【知识模块】 指针 14 【正确答案】 A 【试题解析】 字符型指针变量可以用 A选项的赋值方法: char*s;s=“Olympic“。 C选项的写法: char*s, s=“Olympic“;是错误的。字符数组可以在定义的时候初始化: char s=“Olympic“;或者 char s=“Olympic“,但是不可以在定 义字符数组后对数组名赋值 (数组名是常量,代表数组首地址 ),所以 B选项和 D选项都是错误的。对于本例, B、

23、 D选项中字符数组 s的大小至少为 8,才能存放下字符串 (字符串的末尾都有结束标志 0),同时此时 s为字符数组的地址,是常量,不能为其赋值。 【知识模块】 指针 15 【正确答案】 A 【试题解析】 因为小写字符 a、 b、 c的 ASCII码值分别为 97、 98、 99,而在 do while循环语句中,每次对字符的 ASCII码值取余数并输出,所以分别输出 7、8、 9。 【知识模块】 指针 16 【正确答案】 A 【试题解析】 选项 A为正确用法,先将字符串存于字符数组中,然后将数组名赋给字符指针 (数组名代表数组首地址,定义数组时为其分配确定的地址 )。 C选项错误, getch

24、ar()函数输入一个字符给字符型变量,而不是字符指针。 B选项和 D选项有类似的错误,两个选项并无语法错误,但运行时可能会出现问题。因为在B选项和 D选项中,字符指针没有被赋值,是个不确定的值,指向一个不确定的内存区域,这个区域可能存放有用的指令或数据。在这个不确定的区域重新存放字符串,可能会发生无法预知的错误。 【知识模块】 指针 17 【正确答案】 C 【试题解析】 本题中由循环条件可知,遇到 0或 x与 y所指的字符的值不等中的一个条件时就结束,所以功能是统计 x和 y所指字符串中最前面连续相同的字符个数。 【知识模块】 指针 18 【正确答案】 B 【试题解析】 A选项去掉大括号就正确

25、了; C选项和 D选项应在定义时赋初值。B选项正确。 【知识模块】 指针 19 【正确答案】 B 【试题解析】 int(*f)(int);为指向函数的指针变量的定义方法,其中 f为指向函数的指针变量,第一个 int为函数返回值类型,第二个 int为函数的形参类型,因此 B选项正确。 【知识模块】 指针 20 【正确答案】 D 【试题解析】 D选项中, *f(a, b)表示调用后返回一个指向整型数据的地址指针,即该函数的返回值为指针类型,所以不能将其赋值给整形变量 k。 【知识模块】 指针 21 【正确答案】 A 【试题解析】 数组定义后,不可以对数组整体赋值, s是二维数组,因 ss1是一维字

26、符数组,即字符串,字符串赋值可以使用 “strcpy(ss1, “right“); ”这样的形式,而 A选项中对二维数组中的第 “1”维 (相当于一个一维数组 )赋值是不可以的。B选项和 D选项是定义时对数组初始化,这是可以的。在 C选项中,将字符串在内存中的首地址赋给指针数组的一个元素,这是可以的。 【知识模块】 指针 22 【正确答案】 A 【试题解析】 预处理命令是以 “#”号开头的命令,它们不是 C语言的可执行命令,这些命令应该在函数之外书写,一般在源文件的最前面书写,但不是必须在起始位置书写,所以 B、 C选项错误。 C语言的预处理能够实现宏定义和条件编译等功能,所以 D选项错误。

27、【知识模块】 编 译预处理和动态存储分配 23 【正确答案】 A 【试题解析】 宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头,所以 B选项中 “宏定义必须位于源程序中所有语句之前 ”是错误的。宏名一般用大写,但不是必须用大写,所以 C选项错误。宏展开不占运行时间,只占编译时间,函数调用占运行时间 (分配内存、保留现场、值传递、返回值 ),所以D选项错误。 【知识模块】 编译预处理和动态存储分配 24 【正确答案】 C 【试题解析】 宏定义不是 C语句,末尾不需要有分号,语句 printf(“ 4 1fn“, s(a+b);展开后为 printf(“ 4 1f n“, 3

28、5; *a+b*a+b; );,所以程序会出现语法错误。 【知识模块】 编译预处理和动态存储分配 25 【正确答案】 B 【试题解析】 本题考查预编译相关知识,宏定义在编译程序时做了一个简单的替换,所以 B选项正确。 【知识模块】 编译预处理和动态存储分配 26 【正确答案】 C 【试题解析】 本题考查带参数的宏定义, s为带参数的宏定义,运行 s(k+j)为4*(k+j)*k+j+1=143, C选项正确。 【知识模块】 编译预处理和动态存储分配 27 【正确答案】 C 【试题解析】 本题考查宏定义。宏定义只是做简单的替换,本题中SUB(a+b)*c=(a+b)-(a+b)*c=-20,所以 C选项正确。 【知识模块】 编译预处理和动态存储分配 28 【正确答案】 A 【试题解析】 本题考查预处理命令行。预处理是在程序编译之前进行的,所以 A选项错误。 【知识模块】 编译预处理和动态存储分配

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1