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

下载本文档

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

文档简介

国家二级C语言(编译预处理和指针)机试模拟试卷1(共9套)(共234题)国家二级C语言(编译预处理和指针)机试模拟试卷第1套一、选择题(本题共26题,每题1.0分,共26分。)1、以下关于宏的叙述中正确的是A、宏定义必须位于源程序中所有语句之前B、宏名必须用大写字母表示C、宏调用比函数调用耗费时间D、宏替换没有数据类型限制标准答案:D知识点解析:本题考查宏替换的规则。宏替换分为简单的宁符替换和带参数的宏替换两类。使用宏时应注意几点:①宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;②为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写;③双引号中出现的宏名不替换;④使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。2、有以下程序,程序运行后的输出结果是#include<stdio.h>#defineSUB(a)(a)-(a)main(){inta=2,b=3,C=5,d;d=SUB(a+b)*c:printf("%d\n",d);}A、-12B、0C、10D、-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>#defineN2#defineMN+1#defineNUM(M+1)*M/2main(){orintf("%d\n",NUM1);}A、4B、8C、9D、6标准答案:B知识点解析:宏展开以后NUM为(2+1+1)*2+1/2,计算以后值为8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计算。5、有以下程序,程序的输出结果是#include<stdio.h>#defineSQR(X)X*Xmain(){inta=10,k=2,m=1;a/=SQR(k+m)/SQR(k+m);printf("%d\n",a);}A、0B、1C、9D、10标准答案:B知识点解析:SQR(k+m)宏展开以后为k+m*k+m,值为5,表达式a/=SQR(k+m)/SQR(k+m)为a=a/(5+5),表达式值为1。6、有以下程序,程序运行后的输出结果是#include<stdio.h>#include<stdlib-h>main(){int*a,*b,*c;a=b=c=(int*)malloc(sizeof(int));*a=1:*b=2,*c=3;a=b;printf("%d,%d,%d\n",*a,*b,*c);}A、2,2,3B、3,3,3C、1,2,3D、1,1,3标准答案:B知识点解析:a=b=c=(int*)malloc(sizeof(int)):含义为申请了一个整型的存储空间,让指针a,b,c分别指向它,*a=1;*b=2;*c=3;语句的含义为所申请的整型存储空间的内容,*c=3最后执行导致存储空间的内容为3。a=b的含义让指针a也指向指针b所指向的存储空间,a,b,c都指向整型的存储空间,里边的内容为3。7、有以下程序,程序的输出结果是voidfun(double*p1,double*p2,double*s){s=(double*)calloc(1,sizeof(double));*s=*P1+*(p2+1);}main(){doublea[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;fun(a,b,s);printf("%5.2f\n",*s);}A、1.10B、11.10C、12.10D、21.10标准答案:A知识点解析:.ANSIC标准规定calloc函数返回值的类型为void*。具体使用格式为:calloc(n,size)。该函数用来给n个同一类型的数据项分配连续的存储空间,每个数据项的长度为size个字节。若分配成功,函数返回存储空间的首地址;否则返回空。通过调用calloc函数所分配的存储单元,系统自动置初值0。主函数中定义数组a,b,以及指针s指向数组a,调用fun函数,实参a和b,以及s的值传递给相对应形参p1,p2,以及s,在fun函数中更改s的指向,以及指向的数据,但是函数调用结束以后,形参空间撤销,这项改变对于实参没有影响。因此实参s指向值不变,仍然为1.1。8、以下叙述中正确的是A、指针变量只能通过求地址运算符(&)来获得地址值B、语句“p=NULL;”与“p=\0;”是等价的语句C、“int*P1;int**p2;int*p3;”都是合法的定义指针变量的语句D、语句p=NULL;执行后,指针P指向地址为0的存储单元标准答案:C知识点解析:指针变量定义形式为:类型*指针变量名;其中*号的个数决定了几级指针,指针变量赋地址值的方式有3种方式:①通过求地址运算符(&)获得地址值;②通过指针变量获得地址值;③通过标准函数获得地址值。另外NULL是在stdio.h头文件中定义的预定义符。NULL的代码值为0。可以给指针变量赋NULL值。例如p=NULL;赋值语句,称p为空指针。这条语句等价于p=’\0’;或p=0;这时,指针p并不是指向地址为0的存储单元,而是具有一个确定的值——“空”。9、设有定义:intx=0,*p;紧接着的赋值语句正确的是A、*p=NULL;B、p=NULL;C、p=x;D、*p=x;标准答案:B知识点解析:定义指针变量时,必须将指针变量初始化为NULL(为空),否则,如果不赋给它地址,系统会随机给它分配一个地址。10、有以下程序,程序运行后的输出结果是main(){intm=1,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,2B、1,2,2,1C、2,1,2,1D、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=1,b=3,c=5;int*p1=&a,*p2=&b,**p=&c;*p=*p1*(*p2);printf("%d\n",c);}A、2B、3C、1D、4标准答案:B知识点解析:程序使整型指针p1、p2、p3指向a、b、c值所存放的地址空间。然后再将指针变量*p1、*p2中的值的乘积赋给指针变量*p,即赋给变量c,输出c的值3。12、有以下程序main(){inta[5]={2,4,6,8,10},*p,**k;p=a:k=&p;printf("%d",*(p++));printf("%d\n",**k);}程序运行后的输出结果是A、44B、24C、22D、46标准答案:B知识点解析:主函数中指针变量p指向数组a中下标为0的元素,k指向p,那么*(p++)的值为2,p指向数组中下标为1的元素,k指向p,所以*k的值为4。13、设有定义:char*c:以下选项中能够使c正确指向一个字符串的是A、charstr[]="string";c=str;B、scanf("%s",c);C、c=getchar();D、*c="string";标准答案: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=1)*s=n+1;else{fun(n-1,&f);*s=f;}}main(){intx=0;fun(4,&x);printf("%d\n",x);}程序运行后的输出结果是A、1B、3C、4D、2标准答案:D知识点解析:函数fun为递归调用函数,如果n的值为1,那么后面形参指向的空间存放n+1,否则继续计算fun(n-1)的值。调用分析过程:fun(4,&x)→fun(3,&x)→fun(2,&x)→fun(1,&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("%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(int*q)函数的功能是对(*q)的值连续5次自加1。在main()函数中f(a)语句把一维数组a[5]的首地址作为实参,传递给函数f(int.q)的形参q,然后在函数f(int*q)内,a[0]连续5次自加1后,a[0]的值就变成6,所以输出为6,2,3,4,5。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++:}}当执行程序时从键盘上输入HelloBeijing<回车>,则程序的输出结果是A、HELLOBEIJINGB、HelloBeijingC、helloBeijingD、hELLOBeijing标准答案:A知识点解析:子函数fun的功能是把小写字母转换成大写字母,所以程序的输出结果为选项A)。18、有下列程序:voidf(intb[]){intI:for(i=2;i<6;i++)b[i]=2;}main(){inta[10]={1,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[2]到a[5]的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,9,10}。19、若有以下程序#include<stdio.h>intk=7;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",i,*p,**r);}则程序的输出结果是A、3,7,7,7,7,7B、7,7,7,3,3,3C、3,3,3,7,7,7D、7,7,7,3,7,7标准答案:D知识点解析:本题考查了二级指针,二级指针可以保存一级指针的地址。主函数中p指向i,r指向p。函数调用后s指向p,在f函数中t指向全局变量k=7,s指向t,同时s保存了实参p的地址,此时p也指向t,输出三个7,流程转到主函数,i的值为3,p以及r的值为7。20、若有以下程序#include<stdio.h>intk=7,m=5;voidf(int**s){int*t=&k;s=&t;*s=&m;printf("%d,%d,%d,",k,*t,**s);}main(){inti=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*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指向t,此时更改了s的指向,s指向了t,更改了s指向的地址空间内容为m的地址,同时t也指向变量m,因此**s的值为m的值,*t为m的值,k为7。流程返回到主函数,没有对主函数空间的数据和指向作出更改,因此全部为3。21、有以下程序voidfun(intx,inty,int*c,int*d){*c=x+y;*d=x-y;}main(){inta=4,b=3,c=0,d=0;fun(a,b,&c,&d);printf("%d%d\n",c,d);}程序的输出结果是A、43B、34C、71D、00标准答案:C知识点解析:函数fun有四个形参,功能是利用参数的地址传递来计算前两个参数的和与差。主函数中调用fun函数c计算针3,d计算4-3值为1。22、有以下程序voidswap(char*x,char*y)main(){chart;{char*s1="abc",*S2="123";t=*x;*x=*y;*y=t;swap(s1,s2);pfintf("%s,%s\n",s1,s2);}}程序执行后的输出结果是A、abc,123B、123,abcC、321,cbaD、1bc,a23标准答案:D知识点解析:函数voidswap(char*x,char*y)的功能是交换两个字符*x和*y中的内容。在主函数中字符指针s1指向字符串’abc’,s2指向字符串’123’。所以函数swap(s1,s2)的执行结果就是字符’a’和’1’相互交换。23、有以下程序(说明:字*A的ASCII码值是65)voidfun(char*s){while(*s){if(*s%2)printf("%c",*s);s++;}}main(){chara[]="BYTE";fun(a);printf("\n");}程序运行后的输出结果是A、BTB、YEC、YTD、BY标准答案:B知识点解析:程序只输出字母ASCII值为奇数的字母,根据字母B,Y,T,E的ASCII值的奇偶性相应输出。24、有以下程序#include<stdio.h>main()voidfun(char*a,char*b){char*s="****a*b****",t[80];{while(*a==’*’)a++;fun(s,t);puts(t);while(*b=*a){b++;a++;}}}程序的运行结果是A、a*bB、*****a*bC、a*b****D、ab标准答案:C知识点解析:主函数mare()定义了指向字符串的指针和一个字符数组,接着调用fun(s,t)函数,进行实参向形参传递。函数fun()第一个while语句判断*a中的值为“+”时继续扫描,当遇到不是“*”时结束,接着第二个while循环语句,将*a中从“a”开始的后续所有字符都赋予*b,也就是t[80]中的内容为“a*b****”。25、有以下程序#include<stdio.h>main()voidfun(char*t,char*s){charss[10]="acc",aa[10]="bbxxyy";{while(*t!=0)t++;fun(ss,aa);printf("%s,%s\n",ss,aa);while((*t++=*s++)!=0);}}程序的运行结果是A、acc,bbxxyyB、accxxyy,bbxxyyC、accbbxxyy,bbxxyyD、accxyy,bbxxyy标准答案:C知识点解析:fun函数中,第1个while循环语句使指针t指向字符串的末尾,第2个while循环语句实现了字符串t和s的连接。主函数中语句fun(ss,aa)的功能是将字符串aa连接到字符串ss的末尾。26、有以下程序#include<stdio.h>#include<string.h>voidfun(int*p1,int*p2,int*s){s=(int*)calloc(1,sizeof(int));*s=*p1+*p2;flee(s);}main(){inta[2]={1,2},b[2]={40.50},*q=a;fun(a,b,q);printf("%d\n",*q);}程序运行后的输出结果是A、41B、42C、0D、1标准答案:A知识点解析:主函数定义数组a,b,q指向数组a,调用fun函数以后形参接收实参的数据,p1和p2指向数组a和b,同时s指向数组a,在fun函数中改变了s的指向和赋值,但是在程序调用结束之间形参空间全部释放,因此对于s的指向改动不会对主函数参数构成影响。因此主函数中数去*q的值仍然为1。国家二级C语言(编译预处理和指针)机试模拟试卷第2套一、选择题(本题共26题,每题1.0分,共26分。)1、有以下程序,程序运行后的输出结果是#definePT3.5;#defineS(x)PT*x*x;main(){inta=1,b=2;printf("%4.1f\n",S(a+b));}A、31.5B、7.5C、程序有错无输出结果D、14.0标准答案:C知识点解析:本题考查宏定义。预处理语句后面不能加分号,因此程序有错。如果没加分号的话S(a+b)=PT*a+b*a+b=3.5*1+2*1+2=7.5。2、设有宏定义:#defineIsDIV(k,n)((k%n==1)?1:0)且变量m已正确定义并赋值,则宏调用:IsDIV(m,5)&&lsDIV(m,7)为真时所要表达的是A、判断m是否能被5和7整除B、判断m被5或者7整除是否余1C、判断m被5和7整除是否都余1D、判断m是否能被5或者7整除标准答案:C知识点解析:本题考查宏定义和三目运算符。三目运算符的格式为:test?语句1:语句2其中,test可以是任何Boolean表达式。语句1,当test是true时执行该语句,可以是复合语句;语句2,当test是false时执行该语句,可以是复合语句。isDIV(k,n)要表达的是当k除n的余数是1时表达式的值为1,否则为0,所以题中要表达的是m被5和7整除是否都余1。3、有下列程序,程序的运行结果是#include<stdio.h>#defineN5#defineMN+1#definef(x)(x*M)main(){inti1,i2;i1=f(2);i2=f(1+1);printf("%d%d\n",i1,i2);}A、127B、1212C、1111D、117标准答案:D知识点解析:在本题中,定义了3个宏定义语句,分别是:#defineN5、#defineMN+5和#definef(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、若有以下程序,则程序的输出结果是#defineS(x)x*x#defineT(x)S(x)*S(x)main(){intk=5,j=2;printf("%d,%d\n",S(k+j),T(k+j));}A、17,37B、49,2401C、17,289D、49,289标准答案:A知识点解析:本题考查了宏替换,宏替换就是简单的字符替换,不会进行语法错误检查也不会进行运算。“s(k+j)”宏展开以后为“k+i*k+j”,值为17,“T(k+j)”宏展开以后为“k+i*k+j*k+i*k+i”,值为37。5、下面选项中关于编译预处理的叙述正确的是A、凡是以#号开头的行,都被称为编译预处理命令行B、预处理命令行必须使用分号结尾C、预处理命令行不能出现在程序的最后一行D、预处理命令行的作用域是到最近的函数结束处标准答案:A知识点解析:在C语言中,凡是以“#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以“#”号开始,每行的末尾不能用“;”号结束。以区别于C语句、定义和说明语句。根据需要,命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。6、有以下程序,程序的运行结果是#include<stdio.h>#include<stdlib.h>intfun(intn)main(){int*p;{inta;p=(int*)malloc(sizeof(int));a=fun(10);*p=n;return*p;printf("%d\n",a+fun(10));}}A、10B、20C、0D、出错标准答案:B知识点解析:函数fun(intn)的功能是在内存中每次动态的申请一个整型变量的存储空间,把整型变量n的值存入这个存储空间中。所以当在主函数中执行输出语句时,a+fun(10)的值等于20。7、有以下程序段int*p;p=_______malloc(sizeof(int));若要求使P指向一个int型的动态存储单元,在横线处应填入的是A、(int*)B、intC、int*D、(*int)标准答案:A知识点解析:ANSIC标准规定malloc函数返回值的类型为void*。使用形式为:malloc(size),其中size的类型为unsignedint。malloc函数用来分配size个字节的存储区,返回一个指向存储区首地址的基类型为void的地址。若没有足够的内存单元供分配,函数返回空(NULL)。可以通过强制类型转换将返回值转换为需要类型的地址。8、设有定义语句int(*f)(int);则以下叙述正确的是A、f是基类型为int的指针变量B、f是指向int类型一维数组的指针变量C、f是指向函数的指针变量,该函数具有一个int类型的形参D、f是函数名,该函数的返回值是基类型为int类型的地址标准答案:C知识点解析:定义语句int(*f)(int)中f是指向函数的指针变量,该函数中也只有一个int型的形参。9、设有某函数的说明为int*func(inta[10],intn);则下列叙述中,正确的是A、说明中的a[10]写成a[]或*a效果完全一样B、形参a对应的实参只能是数组名C、func的函数体中不能对a进行移动指针(如a++)的操作D、只有指向10个整数内存单元的指针,才能作为实参传给a标准答案:A知识点解析:函数:func为返回值为指针的函数,有两个形参,形参数组a为指针变量,保存实参数组的首地址,其元素个数由实参数组决定,因此说明中的a[10]写成a[]或*a效果完全一样。10、设已有定义:floatx;则以下对指针变量p进行定义且赋初值的语句中正确的是A、int*p=(float)x;B、float*p=&x;C、floatp=&x;D、float*p=1024;标准答案:B知识点解析:定义指针变量的一般形式为:类型名*指针变量名1,*指针变量名2,……;对一个指针变量赋值要通过求地址运算符(&)获得变量的地址值,然后把此地址值赋给指针变量。因而在选项A)的表达式中。赋值号的左边表示定义了指针变量口,而右边表示求变量x的地址值。11、设有定义doublea[10],*s=a;以下能够代表数组元素a[3]的是A、(*s)[3]B、*s[3]C、*s+3D、*(s+3)标准答案:D知识点解析:语句*s=a,使用指针变量s指向一维数组a的首地址,所以*(s+3)表示的是引用数组a[3]。12、若有定义语句:intyear=2009,*p=&year;以下不能使变量year中的值增至2010的语句是A、(*p)++;B、++(*p);C、*p++;D、*p+=1;标准答案:C知识点解析:由于自加运算符++的运算级高于间接运算*的运算级,所以选项A)的表达式*p++不能使变量year中的值增至2010。13、有以下程序(注:字符a的ASCII码值为97)main(){char*s={"abc"};do{printf("%d",*s%10);++s;}while(*s);}程序运行后的输出结果是A、abcB、7890C、979899D、789标准答案:D知识点解析:因为小写字符a,b,c的ASCII的值分别为97,98,99,而在dowhile循环语句中,每次对字符的ASCII的值取余数并输出,第一次循环输出7,第二次循环输出8,第三次循环输出9。14、若有定义语句:doublea,*p=&a;以下叙述中错误的是A、定义语句中的*号是一个说明符B、定义语句中的p只能存放double类型变量的地址C、定义语句中,*p=&a把变量a的地址作为初值赋给指针变量pD、定义语句中的*号是一个间址运算符标准答案:D知识点解析:在指针定义语句“doublea,*p=&a”中,指针变量p前面的*号,只是一个说明符,说明变量p是指针类型的变量。15、有以下程序voidfun(char*s){chara[10];main(){char*p="PROGRAM";strcpy(a,"STRING");fun(p);sa;}printf("%s\n",p);}程序运行后的输出结果是(此处□代表空格)A、STRING□□□□B、PROGRAMC、STRING□□□D、STRING标准答案:B知识点解析:函数fun的主要功能是把字符串"STRING",存放到字符数组a中,s指向该字符串,函数调用结束以后,释放s和a指向的空间。主函数调用fun(p),并不能更改p的值。因此p的指向没有改变。16、有以下程序#include<stdio.h>main()#defineN4{intx[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},voidfun(inta[][N],intb[])y[N],i;{inti;fun(x,y);for(i=0;i<N;i++)b[i]=a[i][i];for(i=0;i<N;i++)printf("%d,",y[i]);)printf("kn");}程序的运行结果是A、1,2,3,4,B、1,4,5,9,C、1,0,7,0,D、3,4,8,10,标准答案:C知识点解析:函数矗m(inta[][N],intb[])的功能是把矩阵a[N][N]主对角线上的元素赋给一维数组b[]。在主函数中由x[][N]的初始化可知,其主对角线上的元素是1,0,7,0。所以当执行完函数fun(x,y)后,一维数组元素y[]中的元素值为1,0,7,0。17、以F函数按每行8个输出数组中的数据:voidfun(int*w,intn){inti;for(i=0:i<n;i++){______________printf("%d",w[i]);}printf("\n");}下划线处应填入的语句是A、if(i%8==0)printf("\n");B、if(i/8==0)continue;C、if(i/8==0)printf("\n");D、if(i%8==0)continue;标准答案:A知识点解析:本题考查判断语句与循环语句。欲使每行输出8个数据,则必然使用取余运算,当i%8==0时先输出一个换行符再输出字符。选项D)中,comtinue语句的作用是停止执行本次循环位于continue后面的语句,而进入下一次循环。18、有以下程序#include<stdio.h>main()voidfun(int*a,int*b){intx=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,3B、3,5,3,5C、5,3,3,5D、5,3,5,3标准答案:B知识点解析:本题考查函数的调用与指针。D和q分别为指向x和y的指针,函数fun()的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能返回主函数。而主函数中,fun(p,q)、fun(&x,&y)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。19、若有以下程序#include<stdio.h>voidsp(int*a){intb=2;main(){intk=3,*p=&k;a=&b;sp(p);*a=*a*2;printf("%d,%d\n",k,*p);printf("%d",*a);}}则程序的输出结果是A、4,3,4B、4,3,3C、6,3,6D、6,6,6标准答案:B知识点解析:主函数中定义指针变量p指向k,调用函数sp(p),将k的地址传递给形参指针a,函数转到sp运行,a指向b的地址,表达式*a=*a+2,相当于b=b*2,得到*a的数据4输出。函数调用结束,此时a和b的空间撤销,而对实参k和p的值并没有改变,仍旧是3。20、若有以下程序#3include<stdio_h>main(){intk=3;voidsp(int*a){intb=2;sp(&k);*a=*a*2;printf("%d\n",k);printf("%d,",*a);}a=&b;*a=*a*2;printf("%d,",*a);}则程序的输出结果是A、6,4,6B、6,4,3C、6,12,12D、9,4,9标准答案:A知识点解析:本题考查了指针作为函数的参数,可以接收实参变量的地址,改变实参的值。主函数调用sp(&k),执行sp函数a指向向k,执行语句*a=*a*2后a指向空间的值k的值为6,改变a的指向以后,此时a指向b,则执行*a=*a*2以后,a指向空间b的值为4。调用结束返回主函数.输出k的值为6。21、有以下程序#include<stdio.h>intfuna(inta,intb){retuma+b;}intfunb(inta,intb){returna-b;}intsss(int(*t)(),intx,inty){retum((*t)(x,y));}main(){intx;X=SSS(funa,9,3);x+=sss(funb,8,3);printf("%d\n",x);}程序运行后的输出结果是A、17B、23C、24D、22标准答案:A知识点解析:函数funa的功能计算两个数据的和,funb的功能计算两个数据的差,函数sss中利用指向函数的指针作为函数的参数,可以在调用的时候,根据接收的函数地址来决定调用那一个函数。主函数中调用x=sss(funa,9,3),将funa函数的地址传递给t,因此sss函数成为求两个数据的和12,继续将funb函数地址传给t,求两个数据差为5,和s累加后结果为17。22、有以下程序charfun(char*c){if(*c<=’Z’&&*c>=’A’)*c-=’A’-’a’;return*c;}main(){chars[81],*p=s;gets(s);while(*p){*p=fun(P);putchar(*p);p++;)printf("\n");}若运行时从键盘上输入OPENTHEDOOR,程序的输出结果是A、OPENtHEdOORB、openthedoorC、OPENTHEDOORD、OpenTheDoor标准答案:B知识点解析:函数fun的主要功能是判断字符是否为大写字符,如果是则转换为小写字符,主函数读入大写字符串,转换成小写。23、有以下函数intfun(char*s){char*t=s;while(*t++);return(t-s);}该函数的功能是A、比较两个字符串的大小B、计算s所指字符串的长度C、计算s所指字符串占用内存字节的个数D、将s所指字符串复制到字符串t中标准答案:C知识点解析:在函数fun(char*s)中,首先用字符指针变量t指向s,而循环语句while(*t++);的功能是使指针变量t指向字符串变量s的末尾,这时退出循环,因而语句return(t-s);返回的就是字符串s所指字符串的长度。24、有以下程序voidfun1(char*p)main(){char*q;{chara[]={"Program"},*p;q=p;p=&a[3];fun1(p);printf("%s\n",a);while(*q!=’\0’)}{(*q)++;q++;}}程序执行后的输出结果是A、PrphsbnB、ProhsbnC、ProgsbnD、Program标准答案:B知识点解析:在函数voidfunl(char*p)中,语句(*q)++的功能是q所指的字符加1,变成其后面的字符:q++就是指针q指向下一个字符的位置。所以在主函数中。语句p=&a[3]的作用是使指针p指向字符数组a[]中的第四个字符的位置,即D指向字符’g’:然后调用函数fun1(p)后,字符’g’变成’h’,字符’r’变成’s’,字符’a’变成’b’,字符’m’变成’n’,因而字符数组a[]中的内容就成“Prohshn”。25、有以下程序#include<stdio.h>#include<string.h>voidfun(chars[][10],intn){chart;inti,j;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(s[i][0]>s[j][0]){t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}}main(){charss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc"};fun(ss,5A、aaaacc,xyB、bcc,aabccC、xy,aaaaccD、aabcc,bcc标准答案:C知识点解析:函数fun([chars[][10],intn)通过两重for循环语句,比较二维字符数组s[][10]的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符,则交换这两个字符串的首字符。在主函数中,语句fun(ss,5)的作用是对二维字符数组ss[5][10]的5个字符串的首字符进行从小到大的排序,不影响各个字符串另外的字符。所以排序结束后,5个字符串的第一个字符依次变为a、a、b、b和x;最后输出第1个和第4个字符串。26、有以下程序:#include<stdio.h>intb=2;intfun(int*k){b=*k+b;return(b);}main(){inta[10]={1,2,3,4,5,6,7,8},i;for(i=2;i<4;i++){b=fun(&a[i])+b;printf("%d",b);}printf("\n");}程序运行后的输出结果是A、810B、1028C、1012D、1016标准答案:B知识点解析:i=2时,fua(&a[2])返回值是b=b+a[1]=2+3=5,b=b+b=5+5=10:i=3时,fun(&a[3])返回值是b=b+a[3]=10+4=14,b=b+b=14+14=28。国家二级C语言(编译预处理和指针)机试模拟试卷第3套一、选择题(本题共26题,每题1.0分,共26分。)1、有以下程序#includevoidfun(int*a,int*b){int*c;c=a;a=b;b=c;}main(){intx=3,y=5,*p=&x,*q=&y;fun(p,q);printf("%d,%d,",*p,*q);fun(&x,&y);printf("%d,%d\n",*p,*q);}程序运行后的输出结果是A、3,5,5,3B、3,5,3,5C、5,3,3,5D、5,3,5,3标准答案:B知识点解析:本题考查函数的调用与指针。p和q分别为指向x和y的指针,函数fun()的两个形参均为指针型,主要功能为交换两个指针的指向,当调用结束以后,该操作不能返回主函数。而主函数中,fun(p,q)、fun(&x,&y)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。2、有下列程序:voidf(intb[]){intI;for(i=2;i<6;i++)b[i]*=2;}main(){inta[i0]={1,2,3,4,5,6,7,8,9,10),j;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[2]到a[5]的各个数字乘以2,因而数组a[10]的元素就变成了{1,2,6,8,10,12,7,8,9,10}。3、有以下程序#includeintfun(chars[]){intn=0;while(*s<=’9’&&*s>=’0’){n=10*n+*s-’0’;s++;}return(n);}main(){chars[10]={’6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’);printf("%d\n",fun(s));}程序的运行结果是A、61490B、61C、9D、5标准答案:B知识点解析:在fun函数中,while循环的功能是逐个取字符数组s的字符判断其是否是数字。若是则将这些数字组成一个数保存到变量n中,并返回变量n的值。所以在主函数中调用fun(s)时,将把字符数组s中的数字组成一个数输出。因为当指针s指向数组的第3位时,即字符’*’,循环条件不成立,循环结束,返回n的值。所以输出n的值为61。4、若有以下程序#includevoidsp(int*a){intb=2;a=&b;*a=*a*2;printf("%d,",*a);)main(){intk=3,*p=&k;sp(p);printf("%d,%d\n",k,*p);)则程序的输出结果是A、4,3,4B、4,3,3C、6,3,6D、6,6,6标准答案:B知识点解析:主函数中定义指针变量p指向k,调用函数sp(p),将k的地址传递给形参指针a,函数转到sp运行,a指向b的地址,表达式*a=*a*2,相当于b=b*2,得到*a的数据4输出。函数调用结束,此时a和b的空间撤销,而对实参k和p的值并没有改变,仍旧是3。5、若有以下程序#include2ntk=7;voidf(int*s){int*t=&k;*s=t;printf("%d,%d,%d,",k,*t,**s);}main(){infi=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*p,**r);}则程序的输出结果是A、3,7,7,7,7,7B、7,7,7,3,3,3C、3,3,3,7,7,7D、7,7,7,3,7,7标准答案:D知识点解析:本题考查了二级指针,二级指针可以保存一级指针的地址。主函数中p指向i,r指向p,函数调用后s指向p,在f函数中t指向全局变量k=7,s指向t,同时s保存了实参p的地址,此时p也指向t,输出三个7,流程转到主函数,i的值为3,p以及r的值为7。6、若有以下程序#includeint*f(int*s,int*t){int*k;if(*s<*t){k=s;s=t;t=k;}returns;}Inain(){inti=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,5B、5,3,5,3,5C、5,3,3,5,5D、3,5,3,5,5标准答案:D知识点解析:本题考查了返回值为指针的函数,函数f的主要功能为第一个参数小于第二个参数,那么交换指针的指向,这对于实参指向的数据时没有影响的。最后返回比较大的元素的地址。主函数中p指向i,q指向j,调用r=f(p,q),返回q的地址,因此*p=3,*q=5,*r=5。7、若有以下程序#includevoidsp(int*a){intb=2;*a=*a*2;printf("%d,",*a);a=&b;*a=*a*2;printf("%d,",*a);}main(){intk=3;sp(&k);printf("%d\n",k);)则程序的输出结果是A、6,4,6B、6,4,3C、6,12,12D、9,4,9标准答案:A知识点解析:本题考查了指针作为函数的参数,可以接收实参变量的地址,改变实参的值。主函数调用sp(&k),执行sp函数a指向向k,执行语句*a=*a*2后a指向空间的值k的值为6,改变a的指向以后,此时a指向b,则执行*a=*a*2以后,a指向空间b的值为4。调用结束返回主函数,输出k的值为6。8、若有以下程序#includeintk=7,m=5;voidf(int**s){int*t=&k;S=&t;*s=&m;printf("%d,%d,%d,",k,*t,**s);}main(){inti=3,*p=&i,**r=&p;f(r);printf("%d,%d,%d\n",i,*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指向t,此时更改了s的指向,s指向了t,更改了s指向的地址空间内容为m的地址,同时t也指向变量m,因此**s的值为m的值,*t为m的值,k为7。流程返回到丰函数,没有对主函数空间的数据和指向作出更改,因此全部为3。9、若有以下程序#includeint*f(int*s,int*t){intk;if(*s<*t){k=*s;*s=*t;*t=k;}returns;)main(){int1=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,5B、3,5,3,5,5C、5,3,5,3,5D、5,3,3,5,5标准答案:C知识点解析:函数f为返回值为指针的函数,主要功能是返回s和t指向空间值大的数据的地址,同时如何s指向空间数据大于t指向空间的数据,那么交换。t函数p和q指向i和j,值为3和5,j的值大于i的值,因此调用函数f以后,返回j的地址,r指向j,同时i和j的值交换,i=5,j=3,p和q的指向不变,p指向i,q指向j。10、有以下程序#includeintfuna(inta,intb){returna+b;}intfunb(inta,intb){returna-b;}intsss(int:(*t)(),intx,inty){return((*t)(x,y));)main(){intx;x=sss(funa,9,3);x+=sss(funb,8,3);printf("%d\n",x);}程序运行后的输出结果是A、17B、23C、24D、22标准答案:A知识点解析:函数funa的功能计算两个数据的和,funb的功能计算两个数据的差,函数sss中利用指向函数的指针作为函数的参数,可以在调用的时候,根据接收的函数地址来决定调用那一个函数。主函数中调用x=sss(funa,9,3),将funa函数的地址传递给t,因此SSS涿l数成为求两个数据的和12,继续将:funb函数地址传给t,求两个数据差为5,和s累加后结果为17。11、有以下程序voidfun(intx,inty,int*c,int*d){*c=x+y;*d=x-y;}main(){inta=4,b=3,c=0,d=0;fun(a,b,&c,&d);printf("%d%d\n",c,d);}程序的输出结果是A、43B、34C、71D、00标准答案:C知识点解析:函数fun有四个形参,功能是利用参数的地址传递来计算前两个参数的和与差。丰函数中调用fun函数c计算4+3。d计算4.3值为1。12、有以下程序voidfun(int*p,int*q){intt;t=*p;*p=*q;*q=t;*q==*p;}main(){inta=0,b=9;fun(&a,&b);Ptintf(”%d%d\n",a,b);}程序的输出结果是A、00B、99C、90D、09标准答案:B知识点解析:函数:fun的主要功能是交换p和q指向的地址空间的数据,然后更改p的指向的地址空间数据,使之和q指向的数据相同。主函数调用fun后,p指向a,q指向b,囚此a和b的数据全部为9。13、有以下程序charfun(ehar*c){if(*c<=’Z’&&*c>=’A’)*c-=’A’一’a’;return*c;}main(){chars[81],*p=s;gets(s);while(*p){*p=fun(p);putchar(*p);p++;}printf("\n");}若运行时从键盘上输入OPENTHEDOOR,程序的输出结果是A、oPENtHEdOORB、openthedoorC、OPENTHEDOORD、OpenTheDoor标准答案:B知识点解析:函数fun的主要功能是判断字符是否为大写字符,如果是则转换为小写字符,主函数读入大写字符串,转换成小写。14、有以下程序voidswap(char*x,char*y){chart;t=*x;*x=*y;*y=t;}main(){char,*s1="abc",*s2="123";swap(s1,s2);printf("%s,%s\n",s1,s2);}程序执行后的输出结果是A、abc,123B、123,abcC、321,cbaD、lbc,a23标准答案:D知识点解析:函数voidswap(chat*x,chat*y)的功能是交换两个字符*x和*y中的内容。在主函数中字符指针s1指向字符串’abc’,s2指向字符串’123’。所以函数swap(s1,s2)的执行结果就是字符’a’和’1’相互交换。15、有以下函数intfun(char*x,char*y){intn=0;while((*x:=*y)&&*x!=’\0’){x++;y++;n++;}returnn;}函数的功能是A、查找x和y所指字符串中是否有’\0’B、统计x和y所指字符串中最前面连续相同的字符个数C、将y所指字符串赋给x所指存储空间D、统计x和y所指字符串中相同的字符个数标准答案:B知识点解析:在while循环中的判断表达式为(*x==*y)&&*x!=’\0’,所以只要字符串x与y的当前字符不相等时,循环就结束。16、有以下函数intfun(char*s){char*t=s;while(*t++);return(t-s);}该函数的功能是A、比较两个字符串的大小B、计算s所指字符串的长度C、计算s所指字符串占用内存字节的个数D、将s所指字符串复制到字符串t中标准答案:C知识点解析:在函数fun(chat*s)中,首先用字符指针变量t指向s,而循环语句while(*t++);的功能是使指针变量t指向字符串变量s的末尾,这时退出循环,因而语句return(t-s);返回的就是字符串s所指字符串的长度。17、有以下程序(说明:字母A的ASCII码值是65)voidfun(char*s){while(*s){if(*s%2)printf("%c",*s);s++;}}main(){chara[]="BYTE";fun(a);print=f("\n");)程序运行后的输出结果是A、BTB、YEC、YTD、BY标准答案:B知识点解析:程序只输出字母ASCII值为奇数的字母,根据字母B,Y,T,E的ASCII值的奇偶性相应输出。18、有以下程序#includevoidfun(char**p){++p;printf("%s\n",*p);}main(){char*a[]=("Morning","Afternoon","Even~ng","Night");fun(a);}程序的运行结果是A、ftemoonB、MorningC、orningD、Aftemoon标准答案:D知识点解析:在程序中,指针的指针变量a和p都是指向字符串的指针。执行fun(a)语句时,p指向的是字符串数组a的第一个字符串“Morning”,p自加1之后,*p指向了字符串数组a的第2个字符串“Afternoon”。19、有以下程序voidfunl(char*p){char*q;q=p;while(*q!=’\0’){(*q)++;q++;}}main_(){chara[]={"Program"),*p;p=&a[3];fun1(p);printf("%s\n",a);}程序执行后的输出结果是A、PrphsbnB、ProhsbnC、ProgsbnD、Program标准答案:B知识点解析:在函数voidfunl(char*p)中,语句(*q)++的功能是q所指的字符加1,变成其后而的字符;q++就是指针q指向下一个字符的位置。所以在主函数中,语句p=&a[3]的作用是使指针p指向字符数组a[]中的第四个字符的位置,即p指向字符’g’;然后调用函数fun1(p)后,字符’g’变成’h’,字符’r’变成’s’,字符’a’变成’b’,字符’m’变成’n’,因而字符数组a[]中的内容就成“Prohsbn”。20、有以下程序#includevoidfun(char*a,char*b){while(*a==’*’)a++;while(*b=*a){b++;a++;)}main(){char*s="*****a*b****",t[80];fun(s,t);putS(t);}程序的运行结果是A、a*bB、*****a*bC、a*b****D、ab标准答案:C知识点解析:主函数main()定义了指向字符串的指针和一个字符数组,接着调用fun(s,t)函数,进行实参向形参传递,雨数fun()第一个while语句判断*a中的值为“*”时继续扫描,当遇到不是“*”时结束,接着第二个while循环语句,将*a中从“a”开始的后续所有字符都赋予*b,也就是t[80]中的内容为“a*b****”。21、下列函数的功能是voidfun(char*a,char*b){while((*b=*a)!=’\0’){a++;b++;}}A、使指针b指向a所指字符串B、将a所指字符串和b所指字符串进行比较C、将a所指字符串赋给b所指空间D、检查a和b所指字符串中是否有’\0’标准答案:C知识点解析:存while语句的条件中是把字符*a的值赋给字符*b,然后再判断字符*b的值是否等于字符串的结束字符(’\0’),当不等于结束字符(’\0’)时,把字符指针变量a,b分别加1,指它们的下一个字符,直到字符串a的结束。这样程序执行的结果就是把字符串a赋给了b所指的存储空间。22、有以下程序#include#includevoidfun(chars[][10],intn){chart;inti,j;for(i=0;is[j][0]){t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}}main(){charss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc");fun(ss,5);printf("%s,%s\n",ss[0],ss[4]};}程序的运行结果是A、aaaacc,xyB、bcc,aabccC、xy,aaaaccD、aabcc,bcc标准答案:C知识点解析:函数fun(chars[][10],intn)通过两重for循环语句,比较二维字符数组s[][10]的每个字符串的首字符大小,如果前一个字符串首字符大于后一个字符串的首字符,则交换这两个字符串的首字符。在丰函数中,语句fun(ss,5)的作用是对二维字符数组ss[5][10]的5个字符串的首字符进行从小到大的排序,不影响各个字符串另外的字符。所以排序结束后,5个字符串的第一个字符依次变为a、a、b、b和x;最后输出第1个和第4个字符串。23、有以下程序#includevoidfun(char*t,char*s){while(*t!=0)t++;while((*t++=*s++)!=0),}maiin_(){charss[10]="acc",aa[10]="bbxxyy";fun(ss,aa);printf("%s,%s\n",ss,aa);}程序的运行结果是A、acc,bbxxyyB、accxxyy,bbxxyyC、accbbxxyy,bbxxyyD、accxyy,bbxxyy标准答案:C知识点解析:fun函数中,第1个while循环语句使指针t指向字符串的末尾,第2个while循环语句实现了字符串t和s的连接。主函数中语句。fun(ss,aa)的功能是将字符串aa连接到字符串ss的末尾。24、有以下程序#include#includevoidfun(char*w,intm){chars,*p1,*p2;p1=w;p2=w+m-1;while(p1A、116611B、161616C、654321D、123456标准答案:C知识点解析:函数fun的功能是将字符串w中的元素从大到小进行排列,所以在主函数中调用函数fun后,字符串a的元素从大到小进行了排列。25、有以下程序:#includeintb=2;intfun(int‘k){b=*k+b;return(b);}main(){inta[10]={1,2,3,4,5,6,7,8),i;for(i=2;i<4;i++){b=fun(&a[i])+b;printf("%d",b);)printf("\n");}程序运行后的输出结果是A、810B、1028C、1012D、1016标准答案:B知识点解析:i=2时,fun(&a[2])返回值是b=b+a[1]=2+3=5,b=b+b=5+5=10;i=3时,fun(&a[3])返回值是b=b+a[3]=10+4=14,b=b+b=14+14=28。26、有以下程序#include#inoludevoidfun(int*p1,int*p2,int*s){s=(int*)calloc(1,sizeof(int));*s=*p1+*p2;free(s);}main(){inta[2]={1,2},b[2]={40,50},*q=a;fun(a,b,q);printf("%d\n",*q);}程序运行后的输出结果是A、41B、42C、0D、1标准答案:A知识点解析:主函数定义数组a,b,q指向数组a,调用fun函数以后形参接收实参的数据,p1和p2指向数组a和b,同时s指向数组a,在fun函数中改变了s的指向和赋值,但是在程序调用结束之间形参空间全部释放,因此对于s的指向改动不会对主函数参数构成影响。因此主函数中数去*q的值仍然为1。国家二级C语言(编译预处理和指针)机试模拟试卷第4套一、选择题(本题共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、当在程序的开头包含头文件stdio.h时,可以给指针变量赋NULLD、可以给指针变量赋一个整数作为地址值标准答案:D知识点解析:指针变量的值只能是存储单元地址,而不能是一个整数,选项D的描述是错误,为待选答案。函数可以返回内存空间的地址,同时函数形参和实参分别占用不同的内存单元,改变形参的值不会改变对应实参的值,在头文件stdio.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,……;。对一个指针变量赋值要通过求地址运算符(&)获得变量的地址值,然后把此地址值赋给指针变量。因而在选项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\n",m,n,*p,*q);}程序运行后的输出结果是A、1,2,1,2B、1,2,2,1C、2,1,2,1D、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。5、下面选项中的程序段,没有编译错误的是A、char*sp,s[10];sp="Hello";B、char*sp,s[10];s="Hello";C、charstr1[10]="computer",str2[10];str2=str1;D、charmark[];mark="PROGRAM";标准答案:A知识点解析:选项B中数组名为常量,不能赋值,选项C字符数组之间无法完成赋值操作,选项D和选项B相同,无法对数组进行赋值。6、设有定义doublea[10],*s=a;以下能够代表数组元素a[3]的是A、(*s)[3]B、*s[3]C、*s+3D、*(s+3)标准答案:D知识点解析:语句*s=a,使用指针变量s指向一维数组a的首地址,所以*(s+3)表示的是引用数组a[3]。7、有以下程序main(){inta=1,b=3,c=5;int*p1=&a,*p2=&b,*p=&c;*p=*p1*(*p2);printf("%d\n",c);}执行后的输出结果是A、2B、3C、1D、4标准答案:B知识点解析:程序使整型指针p1、p2、p3指向a、b、c值所存放的地址空间。然后再将指针变量*p1、*p2中的值的乘积赋给指针变量*p,即赋给变量c,输出c的值3。8、若有定义语句:inta[2][3],*p[3];则以下语句中正确的是A、p[0]=&a[1][2];B、p[0]=a;C、p=a;D、p[1]=&a;标准答案:A知识点解析:定义语句inta[2][3],*p[3];定义了整型二维数组a[2][3]和指针数组p[3]。在C语言中,二维数组名也是一个存放地址常量的指针,其值为二维数组中第一行的地址。所以选项A中,把整型数组a[0]的指针赋给p[0]。9、若有定义语句:intyear=2009,*p=&year;以下不能使变量year中的值增至2010的语句是A、(*p)++;B、++(*p);C、*p++;D、*p+=1;标准答案:C知识点解析:由于自加运算符++的运算级高于间接运算*的运算级,所以选项A)的表达式*p++不能使变量year中的值增至2010。10、有以下程序main(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf("%d",*(p++));printf("%d\n",**k);}程序运行后的输出结果是A、44B、24C、22D、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表示1个存储单元的长度D、如果p是指针变量,则*p+1和*(p+1)的效果是一样的标准答案:C知识点解析:移动指针是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。因此,只有当指针指向一串连续的存储单元时,指针的移动才有意义。当指针指向一串连续的存储单元时,可以对指针变量进行加上或减去一个整数的运算,也可以对指向同一串连续存储单元的两个指针进行相减的运算。除此之外,不可以对指针进行任何其他的算术运算。C语言提供了一个间接访问运算符(*),又称间址运算符,它是一个单目运算符,优先级比较高,高于普通的算术运算符,但是低于()运算符,因此*p+1和*(p+1)的含义是不一样。当指针变量中12、有以下程序(注:字符a的ASCII码值为97)main(){char*s={"abc"};do{printf("%d",*s%10);++s;}while(*s);}程序运行后的输出结果是A、abcB、7890C、979899D、789标准答案:D知识点解析:因为小写字符a,b,c的ASCII的值分别为97,98,99,而在dowhile循环语句中,每次对字符的ASCII的值取余数并输出,第一次循环输出7,第二次循环

温馨提示

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

评论

0/150

提交评论