国家二级C语言(编译预处理和指针)机试模拟试卷 (二)_第1页
国家二级C语言(编译预处理和指针)机试模拟试卷 (二)_第2页
国家二级C语言(编译预处理和指针)机试模拟试卷 (二)_第3页
国家二级C语言(编译预处理和指针)机试模拟试卷 (二)_第4页
国家二级C语言(编译预处理和指针)机试模拟试卷 (二)_第5页
已阅读5页,还剩55页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级C语言(编译预处理和指针)

机试模拟试卷第1套

一、选择题(本题共26题,每题1.0分,共26分。)

1、以下关于宏的叙述中正确的是

A、宏定义必须位于源程序中所有语句之前

B、宏名必须用大写字母表示

C、宏调用比函数调用耗费时间

D、宏替换没有数据类型限制

标准答案:D

知识点解析:本题考查宏替换的规则。宏替换分为简单的宁符替换和带参数的宏替

换两类。使用宏时应注意几点:①宏定义仅仅是符号替换,不是赋值语句,因此

不做语法检查;②为了区别程序中其他的标识符,宏名的定义通常用大写字母,

但不是必须用大写;③双引号中出现的宏名不替换;④使用宏定义可以嵌套,即

后定义的宏中可以使用先定义的宏。

2、有以下程序,程序运行后的输出结果是#山机也〈51€12.11>#€1©1加5皿(编g)-

(a)main(){inta=2,b=3»C=5,d;d=SUB(a+b)*c:printf("%d\n",d);}

A、-12

B、0

C、10

D、-20

标准答案:D

知识点解析:本题主要考查的是宏替换,在程序中执行d=sub(a+b)*c这条语句

时,首先要进行宏替换,依据宏sUB(a)的定义可知,上面这条语句替换为d=(a+b)・

(a+b)*c,因为乘法的优先级比减法的优先级高,所以先进行乘法运算,即d=5-

5*5=20。

3、以下叙述中错误的是

A、预处理命令行的最后不能以分号表示结束

B、C程序对预处理命令行的处理是在程序执行的过程中进行的

C、#defineMAX是合法的宏定义命令行

D、在程序中凡是以开始的语句行都是预处理命令行

标准答案:B

知识点解析:预处理命令行是以“#”开始的语句,预处理命令行的最后不能以分号

表示结束,预处理命令行。其中宏定义的字符替换的定义格式为:#define标识符

字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执

行的过程中。

4、有以下程序,程序运行后的输出结果是#include<stdio_h>#defincN2#dcfine

MN+l#defineNUM(M-1)*M/2main(){orintfC%d\nu,NUM1);}

A、4

B、8

C、9

D、6

标准答案:B

知识点解析:宏展开以后NUM为(2+l+l)*2+l/2,计算以后值为8。注意在进行

宏展开的时候,千万不要试图计算,展开以后再进行计算。

5、有以下程序,程序的输出结果是#includeVstdic.h>#defineSQR(X)X*X

main(){inta=10»k=2,m=l;a/=SQR(k+m)/SQR(k+m);printf("%d\n",a);}

A、0

B、1

C、9

D、10

标准答案:B

知识点解析:SQR(k+m)宏展开以后为k+m*k+m,值为5,表达式a/=SQR(k+m)

/SQR(k+m)为a=a/(5+5),表达式值为1。

6、有以下程序,程序运行后的输出结果是#inchideVstdio.h>#inchideVstdlib-h

>main(){int*a,*b,*c;a=b=c=(int*)malloc(sizeof(int));*a=l:*b=2,*c=3;

a=b;printf(H%d,%d,%d\n",*a,*b,*c);)

A、2,2,3

B、3,3,3

C、1,2,3

D、1,1,3

标准答案:B

知识点解析:a=b=c=(int*)malloc(sizeof(int)):含义为申请了一个整型的存储空间,

让指针a,b,c分别指向它,*a=l;*b=2;*c=3;语句的含义为所申请的整型存储

空间的内容,*c=3最后执行导致存储空间的内容为3。a=b的含义让指针a也指向

指针b所指向的存储空间,a,b,c都指向整型的存储空间,里边的内容为3。

7、有以下程序,程序的输出结果是voidfun(double*pl,double*p2,double*s)

{s=(double*)calloc(1,sizeof(double));*s=4Pl+*(p2+l);)main(){double

a[2]=(l.1,2.2),b[2]={10.0,20.0),*s=a;fun(a,b,s);printf(n%5.2f

\n",*s);(

A、1.10

B、11.10

C、12.10

D、21.10

标准答案:A

知识点解析:.ANSIC标准规定calloc函数返回值的类型为void,具体使用格式

为:calloc(n,size)。该函数用来给n个同一类型的数据项分配连续的存储空间,

每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否

则返回空。通过调用calloc函数所分配的存储单元,系统自动置初值0。主函数中

定义数组a,b,以及指针s指向数组a,调用fun函数,实参a和b,以及s的值传

递给相对应形参pl,p2,以及s,在fun函数中更改s的指向,以及指向的数据,

但是函数调用结束以后,形参空间撤销,这项改变对于实参没有影响。因此实参s

指向值不变,仍然为1.1。

8、以下叙述中正确的是

A、指针变量只能通过求地址运算符(&)来获得地址值

B、语句“p=NULL:”与"p=\0;”是等价的语句

C、“int*Pl;int**p2;int*p3;”都是合法的定义指针变量的语句

D、语句尸NULL;执行后,指针P指向地址为0的存储单元

标准答案:C

知识点解析:指针变量定义形式为:类型*指针变量名;其中”号的个数决定了几

级指针,指针变量赋地址值的方式有3种方式:①通过求地址运算符(&)获得地址

值;②通过指针变量获得地址值;③通过标准函数获得地址值。另外NULL是

在stdio.h头文件中定义的预定义符。NULL的代码值为0。可以给指针变量赋

NULL{go例如p=NULL;赋值语句,称p为空指针。这条语句等价于p=,\(T;

或p=0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值-

__

9、设有定义:intx=0,*p;紧接着的赋值语句正确的是

A、*p=NULT.:

B、p=NULL;

C、p=x;

D、*p=x;

标准答案:B

知识点解析:定义指针变量时,必须将指针变量初始化为NULL(为空),否则,如

果不赋给它地址,系统会随机给它分配一个地址。

10、有以下程序,程序运行后的输出结果是main()[intm=l,n=2,*p=&m,

*q=&n,*r;r=p;p=q;q=r;printf("%d,%d,%d,%d\n",m,n,*p,

*q);)

A、1,2,1,2

B、1,2,2,1

C、2,1,2,1

D、2,1,1,2

标准答案:B

知识点解析:在主函数定义了3个整数指针变量p,q,r,并且使p指向m,q指

向n,再执行“r=p;p=q:q=r;”这三条语句,使q指向m,p指向n,再输出变量

“m,n,*p,*q"时,它们值分别为1,2,2,1。

11、有以下程序,执行后的输出结果是main(){inta=l,b=3,c=5;int*pl=&a,

*p2=&b,**p=&c;*p=*pl*(*p2);printf("%d\n",c):}

A、2

B、3

C、1

D、4

标准答案:B

知识点解析:程序使整型指针pl、p2、p3指向a、b、c值所存放的地址空间。然

后再将指针变量*pl、*p2中的值的乘积赋给指针变量*p,即赋给变量c,输出c的

值3。

12、有以下程序main(){inta[5]={2,4,6,8,10}.*p>**k;p=a:k=&p;

printf("%d”,*(p++));printf(H%d\n%**k);}程序运行后的输出结果是

A、44

B、24

C、22

D、46

标准答案:B

知识点解析:主函数中有针变量p指向数组a中下标为。的元素,k指向p,那么

*(p++)的值为2,p指向数组中下标为1的元素,k指向p,所以*k的值为4。

13、设有定义:char*c:以下选项中能够使c正确指向一个字符串的是

A、charstr[]=Hstring";c=str;

B、scanf("%s",c);

C、c=getchar();

D、*c="stringu;

标准答案:A

知识点解析:在题目的题干中定义了字符指针变量c,在选项A)中,首先定义字符

数组str,然后再把字符数组str的酋地址赋给字符指针变量c。所以选项A)是正确

的。在选项D)中,如果在定义字符指针c时,同时给c赋初值时,这样的表达式

是正确的。而本题不是在定义指针c时,同时给c赋初值。

14、若有以下定义intx[10],小pt=x;则对x数组元素的正确引用是

A、*(x+3)

B、*&x[10]

C、*(pt+10)

D、pt+3

标准答案:A

知识点解析:本题考查指针的调用。x代表x[10]数组的首地址指针,pt是指向

x[10]数组的首地址的指针,即两者指向同一内存单元。+(x+3)等同于x[3]。

15、有以卜程序voidfun(intn,int*s){intf;if(n=l)*s=n+l;else{fun(n-l,&f);

*s=f;}}main(){intx=0:fun(4,&x);printf(n%d\n",x);}程序运行后的输出

结果是

A、1

B、3

C、4

D、2

标准答案:D

知识点解析:函数fun为递归调用函数,如果n的值为1,那么后面形参指向的空

间存放n+1,否则继续计算fun(n・l)的值。调用分析过程:fun(4,&x)-fun(3,

&x)Tfun(2,&x)->fun(l,&x)在回归的过程中,对于x内的数据并没有改动。

16>有下列程序:voidf(int*q)main(){inti=0;{inta[5]={1»2,3,4,5),i;

for(;i<5;i++)(*q)++;)f(a);for(i=0;i<5;i++)printf(n%d,",a[i]);}程序运

行后的输出结果是

A、2,2,3,4,5,

B、6,2,3,4,5,

C、1,2,3,4,5>

D、2,3,4,5,6,

标准答案:B

知识点解析:voidf(intxq)函数的功能是对(*q)的值连续5次自加1。在main。函数

中f(a)语句把一维数组a[5]的首地址作为实参,传递给函数f(int.q)的形参q,然

后在函数f(int*q)内,a[0]连续5次自加1后,a⑼的值就变成6,所以输出为6,

2,3.4*5c

17、有以下程序:#include<stdio.h>voidmain()voidfun(char*c){chars[81];

{while(*c)gets(s);fun(s);puts(s);{if(*c>=,a,&&*c<=,z,)*c=*c-(,a,-,A,);}

C++:))当执行程序时从键盘上输入HelloBeijingV回车》,则程序的输出结果是

A、HELLOBEIJING

B、HelloBeijing

C^helloBeijing

D、hELLOBeijing

标准答案:A

知识点解析:子函数fun的功能是把小写字母转换成大写字母,所以程序的输出结

果为选项A)o

18、有下列程序:voidf(intb|]){intI:for(i=2;i<6;i++)b[i]=2;}main(){int

a[10]={l,2,3,4,5,6,7,8,9,10},i;f(a);for(i=0:i<10,

i++)printf("%d,",a[i]);}程序运行后的输出结果是

A、1,2,3,4,5,6,7,8,9,10,

B、1,2,3,4,10,12,14,16,9,10,

C、1,2,6,8,10,12,7,8,9,10,

D、1,2,6,8,10,12,14,16,9,10,

标准答案:C

知识点解析:函数voidf(intb[])的功能是对数组b[]中第2个到第5个元素的值逐

个扩大2倍。所以在main。函数中,f(a)语句的作用是对数组a[10]中从a⑵到。5]

的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,

9,10)o

19、若有以下程序#inchideVstdio.h>intk=7;voidf(int**s){int*t=&k;*s=t;

printf(n%d,%d,%d,",k,*t,**s);}main(){inti=3,*p=&i,**r=&p:

f(r);prinlf("%d,%d,%d\n",i,*p,**r);}则程序的输出结果是

A、3,7,7,7,7,7

B、7,7,7,3,3,3

C、3,3,3,7,7,7

D、7,7,7,3,7,7

标准答案:D

知识点解析:本题考查了二级指针,二级指针可以保存一级指针的地址。主函数中

P指向i,r指向p。函数调用后s指向p,在f函数中I指向全局变量k=7,s指向

t,同时s保存了实参p的地址,此时p也指向3输出三个7,流程转到主函数,i

的值为3,p以及r的值为7。

20、若有以下程序#includeVstdio.h>intk=7,m=5;voidf(int**s){int*t=&k;

s=&t:printf("%d.%d,%d."♦k,*t,**s):)main(){inti=3.

*p=&i,**r=&p;f(r);printf("%d,%d,%d\n”,*p,**r);}则程序的输出

结果是

A、7,5,7,3,3,3,

B、7,5,7,3,5,7,

C>7,5,5,3,3,3,

D、7,7,5,3,3,3,

标准答案:C

知识点解析:本题考查二级指针作为函数的参数,可以通过函数调用来改变主函数

中一级指针的指向。主函数中指针变量p指向i,r指向p,调用f函数,形参指针

s指向p,流程转到f函数执行,指针变量t指向k,s指向I,此时更改了s的指

向,s指向了3更改了s指向的地址空间内容为m的地址,同时I也指向变量m,

因此**s的值为m的值,%为m的值,k为7。流程返回到主函数,没有对主函数

空间的数据和指向作出更改,因此全部为3。

21、有以下程序vo序fun(inlx,inty,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(H%d%d\n",c,d);}程序的

输出结果是

A、43

B、34

C、71

D、00

标准答案:C

知识点解析:函数fun有四个形参,功能是利用参数的地址传递来计算前两个参数

的和与差。主函数中调用fun函数c计算针3,d计算4-3值为1。

22>有以下程序voidswap(char*x,char*y)main(){chart;{chadsl="abc",

*S2=n123";t=*x;*x=*y;*y=t;sw叩(si,s2);pfintf("%s,%s\n",si,

s2);}}程序执行后的输出结果是

A、abc,123

B、123,abc

C、321,cba

D、Ibc,a23

标准答案:D

知识点解析:函数voidswap(char*x,char*y)的功能是交换两个字符*x和*y中的内

容。在主函数中字符指针si指向字符串匕be,,s2指向字符串T23L所以函数

swap(sl,s2)的执行结果就是字符言和T相互交换.

23、有以下程序(说明:字*A的ASCII码值是65)void

fun(char*s){while(*s){if(*s%2)printf(u%c",*s);s++;))main(){char

a[]二"BYTE”;fun(a);printf(”\n”);}程序运行后的输出结果是

A、BT

R、YE

C、YT

D、BY

标准答案:B

知识点解析:程序只输出字母ASCII值为奇数的字母,根据字母B,Y,T,E的

ASCH值的奇偶性相应输出。

24、有以下程序#includeVstdio.h>main。voidfun(char*a,char*b)

{char*s="****a*b****H,t[80];{while(*a=,*,)a++;fun(s,t);puts(t);

while(*b=*a){b4-+;a++;}}}程序的运行结果是

A^a*b

B、*****a*b

C、a*b****

D、ab

标准答案:C

知识点解析:主函数mare()定义了指向字符串的指针和一个字符数组,接着调用

fun(s,。函数,进行实参向形参传递。函数fun()第一个while语句判断*a中的值为

“十”时继续扫描,当遇到不是“*”时结束,接着第二个while循环语句,将*a中从“a”

开始的后续所有字符都赋予*b,也就是U80]中的内容为"a*b****”。

25、有以下程序#includeVstdio.h>main()voidfun(char*t,charts){char

ss[10]="acc,',aa[1O]="bbxxyy";{while(*t!=O)t++;fun(ss,aa):printf("%s,%s\

n",ss,aa);while((*t++=*s++)!=0);)}程序的运行结果是

A、acc,bbxxyy

accxxyy,bbxxyy

C、accbbxxyy,bbxxyy

D^accxyy,bbxxyy

标准答案:C

知识点解析:fun函数中,第1个while循环语句使指针I指向字符串的末尾,第2

个while循环语句实现了字符串t和s的连接。主函数中语句fun(ss,aa)的功能是

将字符串aa连接到字符串ss的末尾。

26、有以下程序#includeVstdio.h>#include<string.h>voidfun(int*pl,

int*p2,int*s){s=(int*)calloc(l,sizeof(int));*s=*pl+*p2:flee(s);}main(){int

a[2]={1,2),b|2]={40.50},*q=a;fun(a,b,q);printf("%d\nM,*q);}程序

运行后的输出结果是

A、41

B、42

C、0

D、1

标准答案:A

知识点解析:主函数定义数组a,b,q指向数组a,调用fun函数以后形参接收实

参的数据.pl和p2指向数组a和h.同时*指向数组a.在fun函数中改变了*的

指向和赋值,但是在程序调用结束之间形参空间全部释放,因此对于s的指向改动

不会对主函数参数构成影响。因此主函数中数去*q的值仍然为lo

国家二级C语言(编译预处理和指针)

机试模拟试卷第2套

一、选择题(本题共26题,每题1.0分,共26分。)

1、以下叙述中正确的是

A、在C语言中,预处理命令行都以开头

B、预处理命令行必须位于C源程序的起始位置

C、include必须放在C程序的开头

D、C语言的预处理不能实现宏定义和条件编译的功能

标准答案:A

知识点解析:在C语言中,凡是以号开头的行,都称为“编译预处理”命令行。

预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预

处理命令有宏定义、文件包含和条件编译三类。#include<stdio.h>命令行表示程

序中要引用C标准函数库中的标准输入输出函数。

2、有以下程序,程序运行后的输出结果是#include<stdio.h>#detine

S(x)4*(x)*x4+1voidmain(){intk=5,j=2;printf("%d\n",S(k+j));}

A、197

B、143

C、33

D、28

标准答案:B

知识点解析:这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了

带参数的宏S(x),当在主函数中用参数k—+j调用宏S时,根据宏替换的原则,则

S(k+j)=S(5+2)=4*7*5+2+1=143。

3、有以下程序,程序运行后的输出结果是#includeVstdio.h>#definefix)x*x*x

main(){inta=3,s,t:s=f(a+l);t=f((a+l));printf(n%d,%d\n”,s,t);)

A、10,10

B、10,64

C、64,10

D、64,64

标准答案: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。

4、若程序中有宏定义行:#defineN100则以下叙述中正确的是

A、宏定义行中定义了标识符N的值为整数100

B、上述宏定义行实现将100赋给标示符N

C、在运行时用100替换标识符N

D、在编译程序对C源程序进行预处理时用100替换标识符N

标准答案:D

知识点解析:在C语言中,凡是以飞”号开头的行,都称为“编译预处理”。其含义

是在c编译程序对c源程序进行编译前,山编译预处理程序对这些编译预处理命令

进行处理的过程。由#define定义的宏就是编译预处理命令。C程序在进行编译之

前,都要先对程序中所有出现的“宏名”,都用宏定义中的替换文木进行替换。

5、有以下程序,程序运行后的输出结果是#include〈stdio.h>#defineSUB(X,

Y)(X+1)*Ymain(){inta=3,b=4;printf(M%d\n",SUB(a++,b++));}

A、20

B、12

C、16

D、25

标准答案:C

知识点解析:宏展开的结果(a+++l)*b++,后缀自加表达式参加运算,先用a和b

的初值得到表达式的值,进行计算,然后a和b在刍加。因此计算结果为16。

6、以下叙述中正确的是

A、在包含文件中,不得再包含其他文件

B、include命令行不能出现在程序文件的中间

C、在一个程序中,允许使用任意数量的include命令行

D、虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接

标准答案:C

知识点解析:include文件包含命令,使用时应注意以下5个规则:①包含文件

的#吊0期。命令行通常应书写在所用源程序文件的开头,故有时也把包含文件祢作

“头文件头文件名可以由用户指定,其后缀不一定用h[②包含文件中,

般包含有一些公用的#define命令行、外部说明或对(库)函数的原型说明;③当包

含文件修改后,对包含该文件的源程序必须重新进行编译连接:④在一个程序

中,允许有任意多j#include命令行;⑤在包含文件中还可以包含其他文件。

7、有以下程序,程序运行后的输出结果是voidfun(int*pLint*p2,int*s)

{s=(int*)malloc(sizeof(int));*s=*pl+*(p2++);}main(){inta[2]={1,2),

b[21={10,20},*s=a:fun(a,b,s);printf("%d\n",*s);)

A、10

R、\1

C、2

D、I

标准答案:D

知识点解析:主函数中定义指针s指向数组a,调用fun函数,首先是实参传给形

参,因此pl指向a,p2指向b,s指向a,即*s的值为1。流程到调用函数fun执

行,首先更改s的指向为新分空间的首地址,表达式!s=*pl+*(p2++),取p!指向数

据位1,加上p2指向数据10,p2后移,存放到s指向的空间中11.流程结束,形

参s和pl,p2撤销,存入s指向空间的数据丢失,主函数输出s指向数据仍然是

lo

8、设有以下函数:voidfun(intn,char*s){.......}则下面对函数指针的定义和赋值均

正确的是

A、void*pf();pf=fun;

B、void(*pf)(int,char*);pf=fun;

C、void*pf();*pf=fun;

D^void(*pf)(int,char);pf=&fun;

标准答案:B

知识点解析:函数指针的定义形式是:数据类型标识符(*指针变量名)():

void(*pf)()定义了一个没有返回值的函数指针pf,在给函数指针变量赋值时,只需

给出函数名而不必给出参数。所以给pf给赋值时,把函数名fun赋给pf即可。

9、以下叙述中正确的是

A、函数的类型不能是指针类型

B、函数的形参类型不能是指针类型

C、基类型不同的指针变量可以相互混用

D、设有指针变量为“double*p",则“p+1”将指针P移动8个字节

标准答案:D

知识点解析:在对指针进行加、减算术运算时,数字1表示1个存储单元的长度,

而double类型数据在内存中占8个字节,因此移动一次移动8个字节。其他三个

都不正确,

10、以下叙述中错误的是

A、函数可以返回地址值

B、改变函数形参的值,不会改变对应实参的值

C、当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULL

D、可以给指针变量赋一个整数作为地址值

标准答案:D

知识点解析:指针变量的值只能是存储单元地址,而不能是一个整数,选项D)的

描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分

别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件stdio.h

中,NULL被定义为void型的指针。

11、下面选项中的程序段,没有编译错误的是

A^char*sp,s[10];sp="Hcllo";

B、char*sp,s[10];s="Hello";

C、charstrl[10]="computer",str2[10];str2=strl;

D、charmark[l];mark二"PROGRAM”;

标准答案:A

知识点解析:选项B)中数组名为常量,不能赋值,选项C)字符数组之间无法完成

赋值操作,选项D)和选项B)相同,无法对数组进行赋值。

12、若有定义语句:inia[2][3],仙3];则以下语句中正确的是

A、p[0]=&a[l][2];

B、p[0]=a;

C、p=a;

D、p[l]=&a;

标准答案:A

知识点解析:定义语句“inta[2][3],*p[3];”定义了整型二维数组a[2][3]和指针数

组p[3]。在C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数

组中第一行的地址。所以选项A)中,把整型数组a[0]的指针赋给p[0]。

13、以下叙述中正确的是

A、如果p是指针变量,则*p表示变量P的地址值

B、如果p是指针变量,则&p是不合法的表达式

C、在对指针进行加、减算术运算时,数字1表示1个存储单元的长度

D、如果p是指针变量,则举p+1和叫p+1)的效果是一样的

标准答案:c

知识点词析:移动指针是对指针变量加上或减去一个整数.或通过赋值运算,使指

针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针

的移动才有意义。当指针指向一串连续的存储单元时,可以对指针变量进行加上或

减去一个整数的运算,也可以对指向同一串连续存储单元的两个指针进行相减的运

算。除此之外。不可以对指针进行任何其他的算术运算。C语言提供了一个间接访

问运算符(*),又称间址运算符,它是一个单目运算符,优先级比较高,高于普通

的算*运算符,但是低于()运算符,因此*P+1和9(p+l)的含义是不一样。当指针变

量中存放了一个确切的地址值时,就可以用“间接访问运算符''通过指针来引用该地

址的存储单元。

14^有以下程序#includeVstdio.h>main(){intn,*p=NULL:*p=&n;

printf("Inputn:");scanf("%d",&p);printf("outputn:");printf("%d\n",p);)

该程序试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正

确的是

A、intn,*p=NULL:

B、*p=&n;

「、scanf("%d".&p)

D、printf("%d\n",p);

标准答案:A

知识点解析:选项A)表示在程序中,声明定义变量语句“intn,*p=NULL;”定义

了整型变量n和指针变量p,并旦指针变量p初始化为空。其他的语句都是错误

的。其中选项B),&n的地址应存放到指针变量p中,而选项C)中数据输入项错

误,选项D)输出地址信息。

15、有以下程序intfun1(doublea){returna*=a;)intfun2(doublex,doubley)

{doublea=0,b=0;a=funl(x);b=funl(y);return(int)(a+b);)main(){doublew;

w=fun2(l.1,2.0);……}程序执行后输出结果是

A、5.00

B、5

C>5.21

D、0.0

标准答案:A

知识点解析:子函数fun(doubka)的功能是返回a的平方值的整数部分。子函数

fun2(doubkx,doublev)的功能是返回x的平方值的整数部分与y的平方值的整数

部分的和。又因为题中变量w的定义为double型,函数fun(2)的定义为im型,按

照各类数值型数据间的混合运算,整型数据被转换为实型数据。所以双精度型变量

w的值为5.00o

16、有以卜.程序#include<sidio.h>intfun(char*s){char*p=s;while(*p!=0)p++;

return(p-s);)main(){pnntf(H%d\n",fun("goodbey!"));}程序的输出结果是

A、6

B、8

C、0

D、7

标准答案:B

知识点解析:函数fun的主要功能是计算字符串中实际字符的个数,因此

“goodbey!”含有字符为8,返回值为8。

17、有以卜.程序#include〈sidio.h>main()voidfun(char*c,intd}{charb=,a\

a="A':{*c=*c+l: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

D、a,B,a,B

标准答案:A

知识点解析:本题中fun函数的参数传递方式,形参c是传地址,形参d是传值,

所以在主函数中,执行fun时,把变量b的地址传给了c,把a的值传递给了d,

经过运算.输出的值为Rc在主函数的输出语句中,输出变量h的值为h,变

量a的值为A。

18、有以下程序#includeVsldio.h>voidf(int*p,int*q)voidf(int*p,int*q);

{main()p=p+l;*q=*q+l;{intm=l,n=2,*r=&nu}f(r,&n);printf(H%d,%

d",m,n);}程序运行后的输出结果是

A、2,3

B、1,3

C、I,4

D、1,2

标准答案:B

知识点解析:本题考查函数的调用与指针。fun()函数的作用是:使指针p指向原来

所指变量的下一个变量,使q指针指向的值加1。主函数中,指针r指向m,调用

fun()函数的结果是,使r指向地址位于m后面的变量,使位于n的地址上的变量

(就是n)的值加1,因此,结果为1,3。

19、有以下程序程ncludeVsidio.h>intfun(charsQ)main(){intn=0;{char

s[10]={,6,,"','4','9','O','*'}:while(*sV='9'&&*s>

=,O,)printf(',%d\n",fun(s));{n=10*n+*s-,0,;s++;)(rcturn(n);}程序的运行

结果是

A、61490

B、61

C、9

D、5

标准答案:B

知识点解析:在fun函数中,wbile循环的功能是逐个取字符数组s的字符判断其

是否是数字。若是则将这些数字组成一个数保存到变量n中。并返回变量n的值。

所以在主函数中调用fun(s)时,将把字符数组s中的数字组成一个数输出。因为当

指针s指向数组的第3位时,即字符,",循环条件不成立,循环结束,返回n的

值。所以输出n的值为61。

20、若有以下程序#includcVstdio.h>int*f(int*s,int*t){int*k;if(*s<*t){k=s;

s=t;t=k;}returns;)main(){inli=3,j=5,*p=&i,*q=&j,*r;r=f(p,q);

printf(H%d,%d,%d,%d,%d\n”,i,j9*p,*q,*r):}则程序的输出结果是

A、3,5,5»3,5

B、5,3,5,3,5

C^5,3,3,5,5

D、3,5,3,5,5

标准答案:D

知识点解析:本题考查了返回值为指针的函数,函数f的主要功能为第一个参数小

于第二个参数,那么交疾指针的指向,这对于实参指向的数据时没有影响的。最后

返回比较大的元素的地址。主函数中p指向i,q指向j,调用r=f(p,q)。返回q的

地址,因此*p=3,*q=5,*r=5o

21、若有以下程序#includcVstdio.h>int*t){intk;if(*s<*t){k=*s;

*s=*t;*t=k;)returns;}main(){inti=3,j=5,*p=&i,*q=&j,*r;r=f(p,q);

printf(H%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

标准答案:C

知识点解析:函数f为返回值为指针的函数,主要功能是返回s和t指向空间值大

的数据的地址,同时如何s指向空间数据大于t指向空间的数据,那么交换。主函

数p和q指向i和j,值为3和5,j的值大于i的值,因此调用函数f以后,返回i

的地址,「指向j,同时i和i的值交换,i=5,i=3,p和q的指向不变,p指向i,q

指向j。

22、有以卜程序voidfun(inl*p,int*q){intt;t=*p;*p二*q;幸q=l;*q=*p;}

main(){inta=0,b=9;fun(&a,&b);printf("%d%d\n'\a,b);}程序的输出结

果是

A、00

B、99

C、90

D、09

标准答案:B

知识点解析:函数。fun的主要功能是交换p和q指向的地址空间的数据,然后更

改p的指向的地址空间数据,使之和q指向的数据相同。主函数调用fun后,p指

向a,q指向b,因此a和b的数据全部为9。

23、有以下函数intfun(char*x,char*y){intn=0;while((*x:=*y)&&*x!='\

0"){x++;y++;n++;}returnn;}函数的功能是

A、查找x和y所指字符串中是否有、(T

B、统计x和y所指字符串中最前面连续相同的字符个数

C、将y所指字符串赋给x所指存储空间

D、统计x和y所指字符串中相同的字符个数

标准答案:B

知识点解析:在while循环中的判断表达式为(**=*丫)&&*乂!=,\(T,所以只要字

符串x与y的当前字符不相等时,循环就结束。

24、有以下程序#includcVstdio.h>voidfun(char**p){++p;printf("%sha"»

*p);}main(){char*a[]=(HMorning","Afternoon","Evening","Night");fun(a);

程序的运行结果是

A、ftcmoon

B、Morning

C、orning

D^Afternoon

标准答案:D

知识点解析:在程序中,指针的指针变量a和p都是指向字符串的指针。执行

fun(a)语句时,p指向的是字符串数组a的第一个字符串“Morning”,p自加1之

后,*p指向了字符串数组a的第2个字符串“Afternoon”。

25、下列函数的功能是voidfun(char*a,char*b){while((*b=*a)!=,\0'){3++;

b++;))

A、使指针b指向a所指字符串

B、将a所指字符串和b所指字符串进行比较

C、将a所指字符串赋给b所指空间

D、检杳a和b所指字符串中是否有、(T

标准答案:C

知识点解析:在while语句的条件中是把字符*a的值赋给字符*b,然后再判断字符

*b的值是否等于字符串的结束字符(,\0)当不等于结束字符C\(T)时,把字符指

针变量a,b分别加1,指它们的下一个字符,直到字符串a的结束。这样程序执

行的结果就是把字符串a赋给了b所指的存储空间。

26、有以下程序#inckide〈stdio.h>#include<string.h>voidfun(char*w,intm)

{chars,*pl,*p2;pl=w;p2=w+m-1;while(pl<p2)(s=*pl;*pl=*p2;*p2=s;

pl++;p2-:})main()(chara|]=M123456";fun(a,strlen(a));puts(a);}

A、116611

13、161616

C、654321

D、123456

标准答案:C

知识点解析:函数fun的功能是将字符串w中的元素从大到小进行排列,所以在主

函数中调用函数fun后,字符串a的元素从大到小进行了排列。

国家二级C语言(编译预处理和指针)

机试模拟试卷第3套

一、选择题(本题共26题,每题1.0分,共26分。)

1、设有定义:intx=0,*p;紧接着的赋值语句正确的是

A、*p=NULL;

B、p二NULL;

C、p=x;

D、*p=x;

标准答案:A

知识点解析:定义指针变量时,必须将指针变量初始化为NULL(为空),否则,

如果不赋给它地址,系统会随机给它分配一个地址。

2、以下叙述中错误的是

A、函数可以返回地址值

B、改变函数形参的值,不会改变对应实参的值

C、当在程序的开头包含头文件sidio.h时,可以给指针变量赋NULL

D、可以给指针变量赋一个整数作为地址值

标准答案:D

知识点解析:指针变量的值只能是存储单元地址,而不能是一个整数,选项D的

描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分

别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件Sldio.h

中,NULL被定义为void型的指针。

3、设已有定义:floatx;则以下对指针变量p进行定义且赋初值的语句中正确的是

A、int*p=(float)x;

B、float*p=&x;

C、floatp=&x;

D、float*p=1024;

标准答案:B

知识点解析:定义指针变量的一般形式为:类型名半指针变量名1,行旨针变量名

2,……;o对一个指针变量赋值要通过求地址运算符(&)获得变量的地址值,然后

把此地址值赋给指针变量。因而在选项A的表达式中,赋值号的左边表示定义了

指针变量P,而右边表示求变量x的地址值。

4、有以下程序main(){intm=1,n=2,*p=&m,*q=&n,*r;r=p;p=q;q=r;

printf("%d,%d,%d,%d\nM,m,n,*p,*q);)程序运行后的输出结果是

A、1,2,1,2

B、1,2,21

C、2,1,2,1

D、2』,1,2

标准答案:B

知识点解析:在主函数定义了3个整数指针变量p,q,r,并且使p指向m,q指向

n,再执行r=p;p=q;q=r;这三条语句,使q指向m,p指向n,再输出变量m,n,*p,*q

时,它们值分别为122,1。

5、下面选项中的程序段,没有编译错误的是

A、char*sp,s[10];sp='Hello";

B、char*sp,s[10];s="Hello";

C、charstrl[10]="computer",str2[10];str2=strl;

D、charmark[];mark="PROGRAM";

标准答案:A

知识点解析:选项B中数组名为常量,不能赋值,选项C字符数组之间无法完成

赋值操作,选项D和选项B相同,无法对数组进行赋值。

6、设有定义doublea[10],*s=a;以下能够代表数组元素a[3]的是

A、(*s)[3]

B、*s[3]

C、*s+3

D、*(s+3)

标准答案:D

知识点解析:语句*s=a,使用指针变量s指向一维数组a的首地址,所以*(s+3)表

示的是引用数组a[3]。

7、有以下程序main(){inta=l,b=3,c=5;int*pl=&a,*p2=&b,*p=&c;*p

=*pl*(*p2);printf(',%d\n';c);}执行后的输出结果是

A、2

B、3

C、1

D、4

标准答案:B

知识点解析:程序使整型指针pl、p2、p3指向a、b、c值所存放的地址空间。然

后再将指针变量*pl、加2中的值的乘积赋给指针变量*p,即赋给变量c,输出c的

值3。

8、若有定义语句:inta⑵[3],*p[3];则以下语句中正确的是

A、p[0]=&a[l][2];

B、p|O]=a;

C^p=a;

D^p[I]=&a;

标准答案:A

知识点解析:定义语句inta⑵[3],*p[北定义了整型二维数组a⑵⑶和指针数组

p[3]o在C语言中,二维数组名也是一个存放地址常量的指tI,其值为二维数组中

第一行的地址。所以选预A中,把整型数组a[0]的指针赋给p[0]。

9、若有定义语句:intyear=2009,*p=&year;以下不能使变量year中的值增至2010

的语句是

A、(*p)++;

B、++(*p);

C、*p++;

D、*p+=l;

标准答案:C

知识点解析:由于自加运算符++的运算级高于间接运算*的运算级,所以选项A)的

表达式*P++不能使变量year中的值增至2010。

10、有以下程序main(){inta[5]=(2,4,6,8,10),*p,**k;p=a;k=&p;printf("%d",

*(p++));printf(n%d\nn,**k);}程序运行后的输出结果是

A、44

B、24

C、22

D、46

标准答案:B

知识点解析:主函数中指针变量p指向数组a中下标为0的元素,k指向p,那么*

(P++)的值为2,p指句数组中下标为1的元素,k指向p,所以**k的值为4。

11、以下叙述中正确的是

A、如果p是指针变量,则*p表示变量p的地址值

B、如果p是指针变量,则&p是不合法的表达式

C、在对指针进行加、减算术运算时,数字1表示I个存储单元的长度

D、如果p是指针变量,则*p+l和*(p+l)的效果是一样的

标准答案:C

知识点解析:移动指针是对指针变量加上或减去一个整数,或通过赋值运算,使指

针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针

的移动才有意义。当指针指向一串连续的存储单元时,可以对指针变量进行加上或

减去一个整数的运算,也可以对指向同一串连续存储单元的两个指针进行相减的运

算。除此之外,不可以对指针进行任何其他的算术运算。C语言提供了一个间接访

问运算符(*),又称间址运算符,它是一个单目运算符,优先级比较高,高于普

通的算术运算符,但是低于()运算符,因此*p+1和*(p+1)的含义是不一样。

当指针变量中

12、有以下程序(注:字符2的人541码值为97)111疝11(){m比*$={]血”};此

{printf(”%d”,*s%10);++s;}while(*s);}程序运行后的输出结果是

A、abc

B、7890

C^979899

D、789

标准答案:D

知识点解析:因为小写字符a,b,c的ASCII的值分别为97,98,99,而在dowhile

循环语句中,每次对字符的ASCII的值取余数并输出,第一次循环输出7,第二次

循环输出8,第三次循环输出9。

13、设有定义:char*c;以下选项中能够使c正确指向一个字符串的是

A、charstr[]="stringu;c=str;

R、scanf("%s",c);

C、c=getchar();

D、*c="string";

标准答案:A

知识点解析:在题目的题干中定义了字符指针变量c,在选项A中,首先定义字符

数组str,然后再把字符数组str的首地址赋给字符指针变量c。所以选项A是正确

的。在选项D中,如果在定义字符指针c时,同时给c赋初值时,这样的表达式是

正确的。而本题不是在定义指针c时,同时给c赋初值。

14、有以下程序#inckide<stdio.h>main(){intn,*p=NULL;*p=&n;printf("Input

n:");scanf("%d",&p);printf(noutputn:");printf("%d\nM,p);}该程序试囱通过指露p

为变量n读入数据并输出,但程序有多处错误,以下语句正确的是

A、intn,*p=NULL;

*p=&n;

C、scanf("%d”,&p)

D、printf("%d\n",p);

标准答案:A

知识点解析:选项A表示在程序中,声明定义变量语句“intn,*p=NULL;”定义了整

型变量n和指针变量p,并且指针变量p初始化为空。其他的语句都是错误的。其

中选项B,&n的地址应存放到指针变量p中,而选项C中数据输入项错误,选项

D输出地址信息。

15、若有定义语句:doublea,*p=&a;以下叙述中错误的是

A、定义语句中的*号是一个说明符

13、定义语句中的p只能存放double类型变量的地址

C、定义语句中*p=&a把变量a的地址作为初值赋给指针变量p

D、定义语句中的*号是一个间址运算符

标准答案:D

知识点解析:在指针定义语句doublea,*p=&a中,指针变量p前面的头号,只是一

个说明符,说明变量p是指针类型的变量。

16、若有以下定义intx|10],*pt=x;则对x数组元素的正确引用是

A、*(x+3)

B、*&x[10]

C^*(pt+10)

D、pt+3

标准答案:A

知识点解析:本题考查指针的调用。x代表x[10]数组的首地址指针,pt是指向

x[10]数组的首地址的指针,即两者指向同一内存单元。*(x+3)等同于x[3]。

17、有以下程序intfun1(doublea){returna*=a;}intfun2(doublex,doubley){double

a=0,b=0;a=fun1(x);b=fun1(y);return(int)(a+b);}main(){double

w;w=fun2(l.l,2.0);.......)程序执行片输出结果是

A、5.00

B、5

C、5.21

D、0.0

标准答案:A

知识点解析:子函数funl(doublea)的功能是返回a的平方值的整数部分。子函数

fun2(doublex,doubley)的功能是返回x的平方值的整数部分与y的平方值的整数部

分的和。又因为题中变量w的定义为double型,函数fun(2)的定义为int型,按照

各类数值型数据间的混合运算,整型数据被转换为实型数据。所以双精度型变量w

的值为5.00。

18、有以下程序voidfun(char*s){chara[10];strcpy(a,"STRING");s=a;}main()

{char*p=MPROGRAM";fun(p);printf(H%s\n",p);)程序运行后的输出结果是(此处

□代表空格)

A、STRING□□口口

B、PROGRAM

C、STRINGDDD

D、STRING

标准答案:A

知识点解析:函数fun的主要功能是把字符串“STRING",存放到字符数组a中,s

指向该字符串,函数调用结束以后,释放s和a指向的空间。主函数调用「un

(p),并不能更改p的值,因此p的指向没有改变。

19、有以下程序voidtun(।ntn,int*s)(intf;it(n==l)*s=n+1;else{tun(n-1,

&f);*s=f;}}main(){intx=0;fun(4,&x);printf("%d\n'\x);}程序运行后的输出结

果是

A、1

B、3

C、4

D、2

标准答案:D

知识点解析:函数fun为递归调用函数,如果n的值为1,那么后面形参指向的空

间存放n+l,否则继续计算fun(n-1)的值。调用分析过程如下:fun

(4,&x)-?fun(3,&x)-?fun(2,&x)-?fun(1,&x)在回归的过程中,对于x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论