ImageVerifierCode 换一换
格式:DOC , 页数:18 ,大小:49.50KB ,
资源ID:498995      下载积分:2000 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
如需开发票,请勿充值!快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝扫码支付 微信扫码支付   
注意:如需开发票,请勿充值!
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.mydoc123.com/d-498995.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文([计算机类试卷]国家二级C语言(指针、编译预处理和动态存储分配)机试模拟试卷2及答案与解析.doc)为本站会员(Iclinic170)主动上传,麦多课文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知麦多课文库(发送邮件至master@mydoc123.com或直接QQ联系客服),我们立即给予删除!

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

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