版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
国家二级C语言(编译预处理和指针)机试模拟试卷1(共4套)(共107题)国家二级C语言(编译预处理和指针)机试模拟试卷第1套一、选择题(本题共26题,每题1.0分,共26分。)1、设有定义:intx=0,*p;紧接着的赋值语句正确的是A、*p=NULL;B、p=NULL;C、p=x;D、*p=x;标准答案:B知识点解析:定义指针变量时,必须将指针变量初始化为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);pfintf("%dk\"9c);}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("%dt",*s%10);++s;}while(*s);}程序运行后的输出结果是A、abcB、7890C、979899D、789标准答案:D知识点解析:因为小写字符a,b,c的ASCII的值分别为97,98,99,而在dowhile循环语句中,每次对字符的ASCII的值取余数并输出,第一次循环输出7,第二次循环输出8,第三次循环输出9。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、有以下程序#include<stdio.h>main(){intn,*p=NULL;*p=&n;printf("Inputn:");scanf("%d",&p);printf("outputn:");orintf("%d\n",p:}该程序、试图通过指针p为变量n读入数据并输出,但程序有多处错误,以下语句正确的是A、intn,*p=NULL;B、*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、定义语句中的木号是一个说明符B、定义语句中的p只能存放double类型变量的地址C、定义语句中*p=&a把变量a的地址作为初值赋给指针变量pD、定义语句中的*号是一个间址运算符标准答案: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){doublea=0,b=0;a=fun1(x);b=fun1(y);return(int)(a+b);}main(){doublew;w=fun2(1.1,2.0);……}程序执行后输出结果是A、5.00B、5C、5.21D、0.0标准答案:A知识点解析:子函数fun1(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="PROGRAM";fun(p);printf("%s\n",p);}程序运行后的输出结果是(此处□代表空格)A、STRING□□□□B、PROGRAMC、STRING□□□D、STRING标准答案:B知识点解析:函数fun的主要功能是把字符串"STRING",存放到字符数组a中,s指向该字符串,函数调用结束以后,释放s和a指向的空间。主函数调用fun(p),并不能更改p的值,因此p的指向没有改变。19、有以下程序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)的值。调用分析过程:矗m(4,&x)->fun(3,&x)->fun(2,&x)->fun(1,&x)在回归的过程中,对于x内的数据并没有改动。20、有以下程序#include<stdio.h>intfun(char*s){char*p=s;while(*p!=0)p++;return(p-s);}main(){printf("%d\n",fun("goodbey!"));}程序的输出结果是A、6B、8C、0D、7标准答案:B知识点解析:函数fun的主要功能是计算字符串中实际字符的个数,因此"goodbey!"含有字符为8,返回值为8。21、有以下程序#include<stdio.h>#defineN4voidfun(inta[][N],intb[]){inti;for(i=0;i<N;i++)b[i]=a[i][i];}main(){intx[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i;fun(x,y);for(i=0;i<N;i++)printf("%d,",y[i]);printf("\n");}程序的运行结果是A、1,2,3,4,B、1,4,5,9,C、1,0,7,0,D、394,8,10,标准答案:C知识点解析:函数fun(inta[][N],intb[])的功能是把矩阵a[N][N]主对角线上的元素赋给一维数组b[]。在主函数中由x[][N]的初始化可知,其主对角线上的元素是1,0,7,0。所以当执行完函数fun(x,y)后,…维数组元素y[]中的元素值为1,0,7,0。22、有下列程序:voidf(int*q){inti=0;for(;i<5;i++)(*q)++;}main(){inta[5]={1,2,3,4,5},i;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。23、有以下程序#include<stdio.h>voidfun(char*c,intd){*c=*c+1;d=d+1;printf("%c,%c,",*c,d);}main(){charb=’a’,a=’A’;fun(&b,a);printf("%c,%c\n",b,a);}程序运行后的输出结果是A、b,B,b,AB、b,B,B,AC、a,B,B,aD、a,B,a,B标准答案:A知识点解析:本题中funn函数的参数传递方式,形参c是传地址,形参d是传值,所以在主函数中,执行劬时,把变量b的地址传给了c,把a的值传递给了d,经过运算,输出的值为b,B。在主函数的输出语句中,输出变量b的值为b,变量a的值为A。24、以下函数按每行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)中,continue语句的作用是停止执行本次循环位于continue后面的语句,而进入下一次循环。25、有以下程序:#include<stdio.h>voidfun(char*c){while(*c){if(*c>=’a’&&*c<=’z’)*c=*c-(’a’-’A’);c++;}}voidmain(){chars[81];gets(s);fun(s);puts(s);}当执行程序时从键盘上输入HelloBeijing<回车>,则程序的输出结果是A、HELLOBEIJINGB、HelloBeijingC、helloBeijingD、hELLOBeijing标准答案:A知识点解析:子函数fun的功能是把小写字母转换成大写字母,所以程序的输出结果为选项A)。26、有以下程序#include<stdio.h>voidf(int*p,int*q);main(){intm=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,3B、1,3C、1,4D、1,2标准答案:B知识点解析:本题考查函数的调用与指针。fun()函数的作用是:使指针p指向原来所指变量的下一个变量,使q指针指向的值加1。主函数中,指针r指向m,调用fun()函数的结果是,使r指向地址位于m后面的变量,使位于n的地址上的变量(就是n)的值加1,因此,结果为1,3。国家二级C语言(编译预处理和指针)机试模拟试卷第2套一、选择题(本题共29题,每题1.0分,共29分。)1、以下语句中存在语法错误的是A、charss[][20]={"right?"};B、char*ss[6];ss[1]="right?";C、char*ss[]={"right?"};D、charss[6][20];ss[1]="right?";标准答案:A知识点解析:选项A)中定义了二维数组ss,可以用于存储字符串,但是字符串的存储不能通过赋值,仅可以初始化或者输入得到,而选项C)和A)不同,选项C)为指针数组,对于指针变量可以保存常量字符串的地址。2、下面是有关C语言字符数组的描述,其中错误的是A、不可以用赋值语句给字符数组名赋字符串B、可以用输入语句把字符串整体输入给字符数组C、字符数组中的内容不一定是字符串D、字符数组只能存放字符串标准答案:D知识点解析:本题考查字符数组。选项A)、B)和C)都是正确的,字符数组存放其他数据。3、以下选项中有语法错误的是A、charstr[3][10];str[1]="guest";B、charstr[][10]={"guest"};C、char*str[3];str[1]="guest";D、char*str[]={"guest"};标准答案:A知识点解析:本题考查字符数组的定义和使用。选项A)定义了一个二维字符数组,第二句是直接给字符数组赋值错误,C语言中不能直接给字符数组赋值;选项B)、C)和D)都是正确的。4、下列叙述中正确的是A、两个连续的单引号(")是合法的字符常量B、可以对字符串进行关系运算C、两个连续的双引号("")是合法的字符串常量D、空字符串不占用内存,其内存空间大小是0标准答案:C知识点解析:两个连续的双引号:"",是一个字符串常量,称为“空串”。5、以下选项中,能正确进行字符串赋值的是A、chars[5]={’A’,’B’,’C’,’D’,’E’};B、char*s="ABCDE";C、chars[4][5]={"ABCDE"};D、char*s;gets(s);标准答案:B知识点解析:对于选项A)字符串中无法存放字符串结束标志’\0’,选项C)每行仅仅存放5个字符,同样的不能存放字符串结束标志,选项D)中指针变量s没有实际的内存空间,无法存放输入的字符串。因此正确的选项为B),相当于char*s;s="ABCDE",把字符串常量的首地址存放到指针变量中存储。6、有以下程序#include<stdio.h>intfun(chars[]){char*p=s;while(*P!=0)p++;return(p-s);}main(){printf("%d\n",fun("0ABCDEF"));}程序运行后的输出结果是A、6B、7C、1D、0标准答案:B知识点解析:函数fun的主要功能是计算字符串中实际字符的个数,因此主函数中调用fun得到结果为7。7、若有以下程序段charstr[4][12]={"aa","bbb","ccccc","d"},*strp[4];inti;for(i=0;i<4;i++)strp[i]=str[i];不能正确引用字符串的选项是A、strpB、str[0]C、strp[3]D、*strp标准答案:A知识点解析:程序段中定义指针数组*strp,含有4个元素,for循环strp分别保存了二维数组str中的4个字符串的首地址,因此strp为二级地址,不能保存字符串的首地址,*strp或者strp[0]中存放了字符串"aa"的首地址。所以不能正确引用字符串的为选项A)。8、以下叙述中正确的是A、下面的语句用赋初值方式来定义字符串,其中,“’\0’”是必须的charstr1[]=’s’,’t’,’r’,’1’,’\0’};B、有定义语句:charstr1[]="str1";,数组str1将包含4个元素C、字符串常量“str1”的类型是:字符串数据类型D、字符数组的每个元素可存放一个字符,并且最后一个元素必须是“’\0’”字符标准答案:B知识点解析:选项B)中除了字符串中实际字符之外,还要存储字符串结束标志,应为5个元素。在C语言中没有字符串数据类型,因此选项C)不正确,选项D)字符数组不一定必须存放字符串,因此没有规定最后一个元素为字符串结束标志。9、以下叙述中正确的是A、charca[3][5]={"A","BB","CCC"};是不合语法的B、字符串数组,是指数组中的每个元素都是一个存放字符串的一维数组C、charca[][5]={"A","BB","CCC"};是不合语法的D、char*ca[3]={"A","BB","CCC"};是不合语法的标准答案:B知识点解析:字符串数组,也就是二维字符数组,其中每个元素为一个字符串,选项B)的说法正确。选项A)和C)对于ca的定义是正确的。选项D)定义一个指针数组,可以保存多个字符串的首地址。10、以下叙述中正确的是A、函数调用“strlen(s);”会返回字符串s实际占用内存的大小(以字节为单位)B、两个字符串可以用关系运算符进行大小比较C、当拼接两个字符串时,结果字符串占用的内存空间是两个原串占用空间的和D、C语言本身没有提供对字符串进行整体操作的运算符标准答案:D知识点解析:C语言中没有运算符可以处理字符串,要调用“string”库中的函数来处理字符串,其中strlen函数主要测试字符串中实际字符的个数,比实际占用的内存至少要少一个。Strcat(s1,s2)函数用于连接两个字符串,是把字符串s2连接到s1的后面。11、以下叙述中正确的是A、不能用字符串常量对字符数组名进行整体赋值操作B、字符串常量“Hello”会被隐含处理成一个无名字符型数组,它有5个元素C、“charstr[7]="string!";”在语法上是合法的,运行也是安全的D、“char*str;str="Hello";”与“charstr[];str="Hello";”效果是一样的标准答案:A知识点解析:字符数组仅仅可以采用定义时初始化以及输入得到数据,在程序其他部分不允许对其进行赋值。字符串常量中除了实际字符之外还有结束标志,选项B)错误,而选项C)中,没有空间存放字符串结束标志,因此运行是不安全的。选项D)中第一个str为指针,可以赋值,而后面的为数组,在程序中赋值出错。12、以下叙述中正确的是A、语句“charstr[10]="string!";”和“charstr[10]={"string!"};”并不等价B、对于一维字符数组,不能使用字符串常量来赋初值C、对于字符串常量“string!”,系统已自动在最后加入了“’\0’”字符,表示串结尾D、在语句charstr[]="string!";中,数组str的大小等于字符串的长度标准答案:C知识点解析:在C语言中,字符串是借助于字符型一维数组来存放的,可以借助在定义时初始化以及输入来把字符串存入数组,并规定以字符’\0’作为“字符串结束标志”。’\0’是一个转义字符,称为空值,它的ASCII码值为0。’\0’作为标志占用存储空间,但不计入字符串的实际长度。在C语言中,系统在每个字符串的最后自动加入一个字符(’\0’)作为字符串的结束标志。13、设有定义charstr[]="Hello";则语句printf("%d%d"sizeof(str),strlen(str));的输出结果是A、66B、65C、55D、56标准答案:B知识点解析:sizeof主要用于测试变量所占的实际内存,而strlen函数主要测试字符串中实际字符的个数,字符串”Hello”占有内存6个字节,而字符串中共有5个字符。14、设有定义语句:char*aa[2]={"abcd","ABCD"};则以下叙述正确的是A、aa数组的两个元素只能存放含有4个字符的一维数组的首地址B、aa数组的值分别是字符串"abcd"和"ABCD"C、aa是指针变量,它指向含有两个元素的字符型数组D、aa[0]存放了字符串"abcd"的首地址标准答案:D知识点解析:题目中char*aa[2],定义了指针数组aa,有两个元素,aa[0]存放”abcdt.地址,而aa[1]存放"ABCD"地址。15、以下选项中,没有编译错误的是A、charstr3[]={’d’,’e’,;b’,’u’,’g’,’\0’};B、charstr1[5]="pass",str2[6];str2=str1;C、charname[10];name="china";D、charstr4[];str4="helloworld";标准答案:A知识点解析:选项A)是定义了字符数组str3[],并对其赋初值。选项B)中语句str2=str1非法,字符数组不能直接赋值。选项C),D)和选项B)一致。16、有以下程序main(){chara[5][10]={"one","two","three","four","five"};inti,j;chart;for(i=0;i<4;i++)fof(j=i+1;j<5;j++)if(a[i][0]>a[j][0]){t=a[i][0];a[i][0]=a[j][0];a[i][0]=t;}puts(a[1]);}程序运行后的输出结果是A、fwoB、owoC、twoD、fix标准答案:A知识点解析:这个程序的执行过程是当i=0时,j=1,a[0][0]=o<a[1][0]=t;不置换;当i=1时,j=2,a[1][0]=t=a[2][0]=t;不置换;当i=2时,j=3,a[2][0]=t>a[3][0]=f;置换a[2][0]=f,a[3][0]=t;此时,a[2][0]=ea[1][0]=t,再置换a[2][0]=t,a[1][0]=e:当i=3时,i=4,a[3][0]=f=a43][0]=f;不置换;所以a[1],的结果为fwo。17、设有定义:chars[81];inti=0;以下不能将一行(不超过80个字符)带有空格的字符串正确读入的语句或语句组是A、while((s[i++]=getchar()!=’\n’);s[i]=’\0’;B、scanf("%s",s);C、gets(s);D、do{scanf("%c",&s[i]);}while(s[i++]!=’\n’);s[i]=’\0’;标准答案:B知识点解析:本题考查标准输入输出函数和循环语句。gets(s)函数的作用是将输入的字符读入字符串s,直到遇到回车。而scanf()函数接收字符串时的结束标志为回车或者空格。18、设有定义:charp[]={’1’,’2’,’3’),*q=p;以下不能计算出一个char型数据所占字节数的表达式是A、sizeof(p)B、sizeof(char)C、sizeof(*q)D、sizeof(p[0])标准答案:A知识点解析:选项A)计算的是p[]字符数组首地址所占的内存字节数,返回值数组中所有元素占有的空间。*q和p[0]分别表示数组p中下标为0的字符元素,选项B)和D)都可以计算char型数据占有的字节数。19、有以下程序#include<stdio.h>#include<string.h>voidmain(){charstr[][20]={"One*World","One*Dream!"),*p=str[1];printf("%d,",strlen(p));printf("%s\11",p);}程序运行后的输出结果是A、9,One*Dream!B、10,One*Dream!C、9,One*WorldD、10,One*World标准答案:B知识点解析:在主函数中定义了二维字符数组str,并对它赋初值。定义字符指针p,并把字符串str[1]的地址赋给它一所以这时字符指针p指向字符串“One*Dream!”,然后在两个输出语句中,分别输出这个字符串的长度10和字符串本身。20、有以下程序#include<stdio.h>voidmain(){chars[]="012xy\08s34f4w2";inti,n=0;for(i=0;s[i]!=0;i++)if(s[i]>=’0’&&s[i]<=’9’)n++;printf("%d\n",n);}程序运行后的输出结果是A、0B、7C、3D、8标准答案:C知识点解析:在主函数中的for循环语句中,当s[i]的值不等于0~9之间的数字时,结束循环语句的执行。由字符数组s的初值可以得到for循环语句执行了三次,所以变量n的值等于3。21、以下不能将s所指字符串正确复制到t所指存储空间的是A、for(i=0;t[i]=s[i];i++);B、while(*t=*s){t++;s++;}C、for(i=0;=0;t[i++]=s[j++];);D、do{*t++=*s++;}while(*s);标准答案:D知识点解析:在选项D)中,不能把s所指字符串的结束标志符赋给字符串t。22、下列语句组中,正确的是A、char*s;s="Olympic";B、chars[7];s="Olympic";C、char*s;s={"Olympic"};D、chars[7];s={"Olympic"};标准答案:A知识点解析:选项A)中定义了指针变量s,通过赋值语句保存字符串常量的地址,而字符数组绝对不能赋值,而只能初始化或者输入。23、有以下程序main(){charch[]="uvwxyz",*pc;pc=ch;printf("%c\n",*(pc+5));}程序运行后的输出结果是A、0B、元素ch[5]的地址C、zD、字符v的地址标准答案:C知识点解析:在程序中语句pc=ch;的功能是字符指针pc指向字符串数组ch[]的地址,而*(ps+5)表示字符串数组ch[]中第6个字符z。24、有以下程序#include<stdio.h>voidmain(){chars[]={"012xy"};inti,n=0;for(i=0;s[i]!=0;i++)if(s[i]>=’a’a&&s[i]<=’z’)n++;printf("%d\n",n);}程序运行后的输出结果是A、0B、3C、5D、2标准答案:D知识点解析:这段程序的功能求出字符串s中字符在小写字符a到z之间字符的个数。在程序中字符串s的值为“012xy”,所以在字符串s中符合要求的字符的个数等于2。25、以下能正确定义字符串的语句是A、charstr="\x43";B、charstr[]="\0";C、charstr=";D、charstr[]={’\064’};标准答案:B知识点解析:字符串常量是用一对双括号括起来的一串字符。它用字符数组来存放,不用一对大括号对括起来。26、以下关于字符串的叙述中正确的是A、两个字符串中的字符个数相同时才能进行字符串大小的比较B、可以用关系运算符对字符串的大小进行比较C、空串比空格打头的字符串小D、C语言中有字符串类型的常量和变量标准答案:C知识点解析:C语言本身并没有设置一种类型来定义字符串变量,却允许使用“字符串常量”。字符串常量是由双引号括起来的一串字符。任意两个字符串的大小比较要调用字符串比较函数strcmp(s1,s2)来进行,其比较的方法是依次对s1和s2中对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小(比较字符大小的依据是其ASCII码值)。27、若要求从键盘读入含有空格字符的字符串,应使用函数A、getc()B、gets()C、getchar()D、scanf()标准答案:B知识点解析:scanf()语句中用“空格”间隔不同的字符串,空格将被全部忽略掉,所以用scanf()函数不能输入空格:getchar()函数用于输入字符,其调用形式为:ch=getchar(),getchar()函数从终端读入一个字符作为函数值,把读入的一个字符赋给变量ch。在输入时,空格、回车符都将用于字符读入,而且只有在用户敲入Enter键时,读入才开始执行。gets()函数的调用形式为:gets(str_adr),其中str_adr是存放输入字符串的起始地址,可以是字符数组名、字符数组元素的地址或字符指针变量。gets()函数用来从终端键盘读入字符串(包括空格符),直到读入一个换行符为止。getc()函数的调用形式为:ch=getc(pf)其中pf是文件指针。函数的功能是从pf指定的文件中读入一个字符,并把它作为函数值返回。28、有以下程序,执行后的结果是#include<stdio.h>main(){chars[]="abcde";s+=2;printf("%d\n",s[0]);}A、输出字符C的ASCII码B、输出字符CC、输出字符a的ASCII码D、程序出错标准答案:D知识点解析:因为字符数组s[]中的数组名s表示的是一个地址常量。所以语句“s+=2;”不能将指针在当前位置的基础上再向后移动两位。因而程序编译时出错。29、有下列程序,程序执行后的输出结果是fun(charp[][10]){intn=0,i;for(i=0;i<7;i++)if(p[i][0]==’T’)n++;returnn;}main(){charstr[][10]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};printf("%d\n",fun(str));}A、1B、3C、0D、2标准答案:D知识点解析:本题在主函数中定义了一个字符二维数组str[][10],并用{"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}初始化。函数fun(char。p[][10])的功能是统计出p[][10]中p[i][0]等于字符T的个数。所以fun(str)的功能是统计一周七天中英文名称首字母为“T”的个数。因为字符串“Tue”和“Thu”的首字符是“T”,所以n=2。国家二级C语言(编译预处理和指针)机试模拟试卷第3套一、选择题(本题共26题,每题1.0分,共26分。)1、以下叙述中正确的是A、在C语言中,预处理命令行都以"#"开头B、预处理命令行必须位于C源程序的起始位置C、#include必须放在C程序的开头D、C语言的预处理不能实现宏定义和条件编译的功能标准答案:A知识点解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。预处理命令可以放在程序中的任何位置,其有效范围是从定义开始到文件结束。预处理命令有宏定义、文件包含和条件编译三类。#include<stdio.h>命令行表示程序中要引用C标准函数库中的标准输入输出函数。2、有以下程序,程序运行后的输出结果是#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。3、以下关于宏的叙述中正确的是A、宏定义必须位于源程序中所有语句之前B、宏名必须用大写字母表示C、宏调用比函数调用耗费时间D、宏替换没有数据类型限制标准答案:D知识点解析:本题考查宏替换的规则。宏替换分为简单的字符替换和带参数的宏替换两类。使用宏时应注意几点:①宏定义仅仅是符号替换,不是赋值语句,因此不做语法检查;②为了区别程序中其他的标识符,宏名的定义通常用大写字母,但不是必须用大写;③双引号中出现的宏名不替换;④使用宏定义可以嵌套,即后定义的宏中可以使用先定义的宏。4、有以下程序,程序运行后的输出结果是#include<stdio.h>#defineS(x)4*(x)*x+1voidmain(){intk=5,j=2;printf("%d\n",S(k+j));}A、197B、143C、33D、28标准答案:B知识点解析:这道题涉及到带参数的宏的定义和替换这个知识点。在程序中定义了带参数的宏S(x),当在主函数中用参数k+j调用宏S时,根据宏替换的原则,则S(k+i)=S(5+2)=4*7*5+2+1=143。5、设有宏定义:#defineIsDIV(k,n)((k%n=1)?1:0)且变量m已正确定义并赋值,则宏调用:IsDIV(m,5)&&IsDIV(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。6、有以下程序,程序运行后的输出结果是#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。7、有以下程序,程序运行后的输出结果是#include<stdio.h>#definefix)x*x*xmain(){inta=3,s,t;s=f(a+1);t=f((a+1));printf("%d,%d\n",s,t);}A、10,10B、10,64C、64,10D、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。8、有下列程序,程序的运行结果是#include<stdio.h>#defineN5#deftfieMN+1#definefi[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。9、以下叙述中错误的是A、预处理命令行的最后不能以分号表示结束B、C程序对预处理命令行的处理是在程序执行的过程中进行的C、#defineMAX是合法的宏定义命令行D、在程序中凡是以“#”开始的语句行都是预处理命令行标准答案:B知识点解析:预处理命令行是以“#”开始的语句,预处理命令行的最后不能以分号表示结束,预处理命令行。其中宏定义的字符替换的定义格式为:#define标识符字符串,预处理命令行是在系统对源程序进行编译之前进行处理的,不是在程序执行的过程中。10、若程序中有宏定义行:#defineN100则以下叙述中正确的是A、宏定义行中定义了标识符N的值为整数100B、上述宏定义行实现将100赋给标示符NC、在运行时用100替换标识符ND、在编译程序对C源程序进行预处理时用100替换标识符N标准答案:D知识点解析:在C语言中,凡是以“#”号开头的行,都称为“编译预处理”。其含义是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令进行处理的过程。由#define定义的宏就是编译预处理命令。C程序在进行编译之前,都要先对程序中所有出现的“宏名”,都用宏定义中的替换文本进行替换。11、若有以下程序,则程序的输出结果是#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+j*k+j”,值为17,“T(k+j)”宏展开以后为“k+i*k+j*k+j*k+j”,值为37。12、有以下程序,程序运行后的输出结果是#include<stdio.h>#defineN2#defineMN+1#defineNUM(M+1)*M/2main(){printf("%d\n",NUM);}A、4B、8C、9D、6标准答案:B知识点解析:宏展开以后NUM为(2+1+1)*2+1/2,计算以后值为8。注意在进行宏展开的时候,千万不要试图计算,展开以后再进行计算。13、有以下程序,程序运行后的输出结果是#include<stdio.h>#defineSUB(X,Y)(X+1)*Ymain(){inta=3,b=4;printf("%d\n",SUB(a++,b++));}A、20B、12C、16D、25标准答案:C知识点解析:宏展开的结果(a+++1)*b++,后缀自加表达式参加运算,先用a和b的初值得到表达式的值,进行计算,然后a和b在自加。因此计算结果为16。14、下面选项中关于编译预处理的叙述正确的是A、凡是以#号开头的行,都被称为编译预处理命令行B、预处理命令行必须使用分号结尾C、预处理命令行不能出现在程序的最后一行D、预处理命令行的作用域是到最近的函数结束处标准答案:A知识点解析:在C语言中,凡是以“#”号开头的行,都称为编译预处理命令行。这些预处理命令组成的预处理命令行必须在一行的开头以“#”。号开始,每行的末尾不能用“;”号结束,以区别于C语句、定义和说明语句。根据需要,命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾。15、有以下程序,程序的输出结果是#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。16、以下叙述中正确的是A、在包含文件中,不得再包含其他文件B、#include命令行不能出现在程序文件的中间C、在一个程序中,允许使用任意数量的#include命令行D、虽然包含文件被修改了,包含该文件的源程序也可以不重新进行编译和连接标准答案:C知识点解析:#include文件包含命令,使用时应注意以下5个规则:①包含文件的#include命令行通常应书写在所用源程序文件的开头,故有时也把包含文件称作“头文件”。头文件名可以由用户指定,其后缀不一定用“.h”;②包含文件中,一般包含有一些公用的#define命令行、外部说明或对(库)函数的原型说明;③当包含文件修改后,对包含该文件的源程序必须重新进行编译连接;④在一个程序中,允许有任意多个#include命令行;⑤在包含文件中还可以包含其他文件。17、有以下程序,程序的运行结果是#include<stdio.h>#include<stdlib.h>intfun(intn){int*p;p=(int*)malloc(sizeoffint));*p=n;return*p;main(){inta;a=fun(10);}printf("%d\n",a+fun(10));}A、10B、20C、0D、出错标准答案:B知识点解析:函数fun(intn)的功能是在内存中每次动态的申请一个整型变量的存储空间,把整型变量n的值存入这个存储空间中。所以当在主函数中执行输出语句时,a+fun(10)的值等于20。18、有以下程序,程序运行后的输出结果是#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;pfintf("%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。19、有以下程序,程序运行后的输出结果是voidfun(int*p1,int*p2,int*s){s=(int*)malloc(sizeof(int));*s=*p1+*(p2++);}main(){inta[2]={1,2},b[2]={10,20},*s=a;fun(a,b,s);printf("%d\n",*s);}A、10B、11C、2D、1标准答案:D知识点解析:主函数中定义指针s指向数组a,调用fun函数,首先是实参传给形参,因此p1指向a,p2指向b,s指向a,即*s的值为1。流程到调用函数。fun执行,首先更改s的指向为新分空间的首地址,表达式*s=*p1+*(p2++),取p1指向数据位1,加上p2指向数据10,p2后移,存放到s指向的空间中11流程结束,形参s和p1,p2撤销,存入s指向空间的数据丢失,主函数输出s指向数据仍然是1。20、有以下程序段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)。可以通过强制类型转换将返回值转换为需要类型的地址。21、有以下程序,程序的输出结果是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。22、设有以下函数: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即可。23、设有定义语句int(*f)(int);则以下叙述正确的是A、f是基类型为int的指针变量B、f是指向int类型一维数组的指针变量C、f是指向函数的指针变量,该函数具有一个int类型的形参D、f是函数名,该函数的返回值是基类型为int类型的地址标准答案:C知识点解析:定义语句int(*f)(int)中f是指向函数的指针变量,该函数中也只有一个int型的形参。24、以下叙述中正确的是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的存储单元,而是具有一个确定的值——“空”。25、以下叙述中正确的是A、函数的类型不能是指针类型B、函数的形参类型不能是指针类型C、基类型不同的指针变量可以相互混用D、设有指针变量为“double*p”,则“p+1”将指针P移动8个字节标准答案:D知识点解析:在对指针进行加、减算术运算时,数字1表示1个存储单元的长度,而double类型数据在内存中占8个字节,因此移动一次移动8个字节。其他三个都不正确。26、设有某函数的说明为int*func(inta[10],intn);则下列叙述中,正确的是A、说明中的a[10]写成a[]或木a效果完全一样B、形参a对应的实参只能是数组名C、func的函数体中不能对a进行移动指针(如a++)的操作D、只有指向10个整数内存单元的指针,才能作为实参传给a标准答案:A知识点解析:函数fimc为返回值为指针的函数,有两个形参,形参数组a为指针变量,保存实参数组的首地址,其元素个数由实参数组决定,因此说明中的a[10]写成a[]或*a效果完全一样。国家二级C语言(编译预处理和指针)机试模拟试卷第4套一、选择题(本题共26题,每题1.0分,共26分。)1、有以下程序#include<stdio.h>voidfun(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,&y1)的实参均为x与y的地址,因此,两者结果相同,并且两者指针指向的值不能变化。2、有下列程序: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}。3、有以下程序#include<stdio.h>intfun(chars[]){intn=0;while(*s<=’9’&&*s>=’0’){n=10*n+*s-0’;s++;}return(n];}main(){charsi10]={’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、若有以下程序#include<stdio.h>voidsp(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、若有以下程序#include<stdio.h>intk=7;voidflint**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。6、若有以下程序#include<stdio.h>int*f(int*s,int*t){int*k;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("%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、若有以下程序#include<stdio.h>voidsp(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、若有以下程序#include<stdio.h>intk=7,m=5;voidf(int**s){int*t=&k;s=&t;*s=&m;printf("%d,%d,%ct,",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、若有以下程序#include<stdio.h>int*f(int*s,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("%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指向空间的数据,那么交换。主函数p和q指向i和j,值为3和5,{的值大于i的值,因此调用函数f以后,返回j的地址,r指向i,同时i和j的值交换,i=5,j=3,p和q的指向不变,p指向i,q指向j。10、有以下程序#include<stdio.h>intfuna(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函数成为求两个数据的和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);printf("%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(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的主要功能是判断字符是否为大写字符,如果是则转换为小写字符,主函数读入大写字符串,转换成小写。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、1bc,a23标准答案:D知识点解析:函数voidswap(char*x,char*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所指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 项目规划管理培训课件
- 下肢深静脉血栓治疗方法
- 院内获得性肺炎护理
- 血管活性药使用护理
- 电力电缆施工方案及技术措施
- 紧急突发事件管理制度
- 拓展销售经理岗位职责规章制度
- 突发事件与危机公关管理制度
- 胃癌化疗护理计划单
- 密闭空间应急预案演习计划
- 南方中证500ETF介绍课件
- 高中美术-美术鉴赏《人间生活》
- 《物流系统规划与设计》课程教学大纲
- 护理质控分析整改措施(共5篇)
- 金属矿山安全教育课件
- 托盘演示教学课件
- DB32T 4353-2022 房屋建筑和市政基础设施工程档案资料管理规程
- DBJ61-T 112-2021 高延性混凝土应用技术规程-(高清版)
- 2023年高考数学求定义域专题练习(附答案)
- 农产品品牌与营销课件
- 苏科版一年级心理健康教育第17节《生命更美好》教案(定稿)
评论
0/150
提交评论