C语言习题十指针.docx
- 文档编号:6507510
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:14
- 大小:23.91KB
C语言习题十指针.docx
《C语言习题十指针.docx》由会员分享,可在线阅读,更多相关《C语言习题十指针.docx(14页珍藏版)》请在冰豆网上搜索。
C语言习题十指针
习题十指针
1.有以下程序
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,
解析:
本题考查的是指针作为函数的参数和函数的调用。
题目中定义了一个指针变量作为函数f()的形参。
主函数main()中调用f()函数,当i=0时,执行语句(*q)++,此处*q代表的就是数组元素a[0]的值,即将1进行加1操作;当i=1时,q仍指向数组元素a[0]的地址,因为在函数f()中并未对指针变量q作任何变动,也即*q仍代表了数组元素a[0]的值,所以此次(*q)++即2+1,所以a[0]的值变为3;……直到i=4时,执行(*q)++(即5+1)后a[0]的值变为6。
所以最后的输出结果为:
6,2,3,4,5,。
故本题答案选B。
2.有以下程序
#include
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;C、scanf("%d",&p)D、printf("%d\n",p);
解析:
本题考查的是指针的赋值。
*p代表存储单元的值,而&n代表的是变量n的地址,将一个地址赋给一个值是不正确的,所以选项B错误;指针p代表存储单元的地址,前面不需要再加&,所以选项C错误;选项D是将一个地址进行输出,所以也是错误的。
除了给指针变量赋地址值外,还可以给指针变量赋NULL值,选项A正确。
故本题答案选A。
3.有以下程序
#include
main(intargc,char*argv[])
{inti=1,n=0;
while(i printf("%d\n",n); } 该程序生成的可执行文件名为: proc.exe。 若运行时输入命令行: proc1234567 则程序的输出结果是______。 A、3B、5C、7D、11 解析: 本题考查的是带有参数的main函数。 main()可以带有参数,并且参数只能有两个,第一个参数(argc)类型为整型用来记下命令行的参数个数,第二个参数(argv)为一个字符型指针数组,其各个元素用来记下命令行各参数字符串的首地址。 此题执行时,argc的值为4,在循环中依次使用strlen()函数求出argv (1)、argv (2)、argv(3)指向的字符串(123、45、67)的长度并把他们加到变量n中,得到n的值为7。 故本题答案为C。 4.若有以下函数首部 intfun(doublex[10],int*n) 则下面针对此函数的函数声明语句中正确的是______。 A、intfun(doublex,int*n);B、intfun(double,int); C、intfun(double*x,intn);D、intfun(double*,int*); 解析: 本题考查的是函数的声明。 函数声明可以照写已定义的函数的首部,再加一个分号就成为了对函数的声明,在函数声明中也可以不写形参名,而只写形参的类型,但要保证与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序相同。 字符数组可用指针来表示,所以选项D正确。 故本题答案为D。 5.有以下程序 main() {chars[]={"aeiou"},*ps; ps=s;printf("%c\n",*ps+4);} 程序运行后输出的结果是______。 A、aB、eC、uD、元素s[4]的地址 解析: 本题考查的是指针变量的运算。 此题中先定义一个指针变量ps,并将s的首地址赋给此指针变量,*ps+4相当于先从指针变量ps指向的地址中取出相应数据"a"后,对此数据加4,a的ASCII码为32,32+4=36,对应于字符e。 故本题答案选B。 6.有以下程序 voidchange(intk[]){k[0]=k[5];} main() {intx[10]={1,2,3,4,5,6,7,8,9,10},n=0; while(n<=4) {change(&x[n]);n++;} for(n=0;n<5;n++)printf("%d",x[n]); printf("\n");} 程序运行后输出的结果是______。 A、678910B、13579C、12345D、62345 解析: 本题考查的是数组名作函数参数。 当n=0时,把x[0]的地址传给被调函数change,即将形参k与实参x指向同一个存储单元x[0],执行被调函数后,k[0]=6,即x[0]=6;当n=1时,形参k指向x数组的第1个数组元素所在单元,即k[0]与x[1]共用同一存储单元,执行被调函数后,k[0]=7,即x[1]=7,依次类推得出x[0]到x[4]的值分别为6、7、8、9、10。 故本题答案为A。 7.有以下程序 intadd(inta,int{return(a+b);} main() {intk,(*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); 解析: 此题定义了指向函数的指针变量f指向了函数add的入口地址,所以,要调用函数,可以通过函数名(选项B的形式)或函数指针变量(选项A、D的形式)调用即可,而选项C中是先进行函数调用,然后对调用后返回的整型值求其指针值,是不合理的。 故本题答案为C。 8.有以下程序 main() {inta=1,b=3,c=5; int*p1=&a,*p2=&b,*p=&c; *p=*p1*(*p2); printf("%d\n",c);} 执行后的输出结果是______。 A、1B、2C、3D、4 解析: 本题考查的是通过指针引用数据进行计算。 p1=&a表示指针变量p1指向元素1的地址;p2=&b表示指针变量p2指向元素3的地址;p=&c表示指针变量p指向元素5的地址;执行*p=*p1*(*p2)=1*3=3,所以最后的结果为: 3。 故本题答案为C。 9.在16位编译系统上,若有定义inta[]={10,20,30},*p=&a;,少逗号当执行p++;后,下列说法错误的是______。 A、p向高地址移了一个字节B、p向高地址移了一个存储单元 C、p向高地址移了两个字节D、p与a+1等价 解析: 本题考查的是指针的应用。 题目中p=&a表示指针p指向第一个元素a[0],执行p++是指使p指向下一个数据对象的地址,也就是向高地址移了一个存储单元;因为int数据占两个字节,所以p相当于向高地址移了两个字节,所以选项A错误。 故本题答案为A。 10.有以下程序 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、123,abcB、abc,123C、1bc,a23D、321,cba 解析: 本题考查的是指针变量值的交换。 C语言中,字符串常量在内存中是以字符数组的形式进行存放的,因此字符指针x和y指向的是各字符串的首地址,也就是字符串第一个字符的地址,则*x与*y交换的是字符串的第一个字符,即字符"a"与"1"的交换,而字符串中其它字符保持不变。 故本题答案为C。 11.有以下程序 voidfun1(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、ProhsbnB、PrphsbnC、ProgsbnD、Program 解析: 本题考查的是指向数组的指针作为函数的参数及指针的运算。 如果形参数组中的元素发生变化,实参也将发生相应变化。 指针p指向数组的第三位地址(即字符"g"的地址),q=p也就相当于指针q指向数组的第三位地址。 表达式(*q)++,首先根据()的优先级得到a[3]的值"g",再进行加1运算,所以g也就变成了h;表达式q++是将地址加1,也就是指向下一个地址a[4]。 然后再执行while()语句,直到遇到'\0'结束循环,返回形参。 故本题答案为A。 12.有以下程序 main() {char*p[]={"3697","2548"}; inti,j;longnum=0; for(i=0;i<2;i++) {j=0; while(p[i][j]! ='\0') {if((p[i][j]-'0')%2)num=10*num+p[i][j]-'0'; j+=2;}} printf("%d\n",num);} 程序执行后的输出结果上______。 A、35B、37C、39D、3975 解析: 本题考查的是指针数组。 题目中定义的指针数组"*p[]"相当于一个两行四列的数组。 执行for()语句i=0,j=0,p[i][j]=p[0][0]=3,满足while循环条件,执行循环体中的if语句得num=3,j=2,此时p[i][j]=p[0][2]=9,满足循环条件,执行while循环体得num=39,j=4,判断while条件且不符合并退出while循环;再次执行for()语句i=1,j=0,p[i][j]=p[1][0]=2,满足while条件,执行循环体中的if语句,但不符合if条件,所以num不进行运算,j进行加2运算j=2,此时p[i][j]=p[1][2]=4,if条件还是为假,num不进行运算,j进行加2运算j=4,再执行while语句,条件不符合退出循环。 所以结果为39。 故本题答案为C。 13.设有定义: intn1=0,n2,*p=&n2,*q=&n1;,以下赋值语句中与n2=n1;语句等价的是______。 A、*p=*q;B、p=q;C、*p=&n1;D、p=*q; 解析: 本题考查的是指针变量的赋值。 本题答案为A。 14.有以下程序 voidsum(inta[]) {a[0]=a[-1]+a[1];} main() {inta[10]={1,2,3,4,5,6,7,8,9,10}; sum(&a[2]); printf("%d\n",a[2]);} 程序运行后的输出结果是______。 A、6B、7C、5D、8 解析: 本题考查的是函数参数的传递。 本题答案为A。 15.有以下程序 main() {inta[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],*q=p+2; printf("%d\n",*p+*q);} 程序运行后的输出结果是______。 A、16B、10C、8D、6 解析: 本题考查的是指向数组的指针变量。 数组a各元素a[0]~a[9]的值依次为1~10;在程序的说明部分,指针变量p初始化为&a[3],即*p的值为4;指针变量q初始化为p+2,即&a[3]+2,所以*q的值为6,所以*p+*q的值为10。 故本题答案为B。 16.有以下程序,其中函数f的功能是将多个字符串按字典顺序排序 #include voidf(char*p[],intn) {char*t;inti,j; for(i=0;i for(j=i+1;j if(strcmp(p[i],p[j])>0){t=p[i];p[i]=p[j];p[j]=t;}} main() {char*p[5]={"abc","aabdfg","abbd","dcdbe","cd"}; f(p,5); printf("%d\n",strlen(p[1]));} 程序运行后的输出结果是______。 A、2B、3C、6D、4 解析: 本题经过排序后,得到第二个字符串是"abbd",所以输出结果是4。 故本题答案为D。 17.有以下程序 #include voidf(char*s,char*t) {chark; k=*s;*s=*t;*t=k;s++;t--; if(*s)f(s,t);} main() {charstr[10]="abcdefg",*p; p=str+strlen(str)/2+1; f(p,p-2); printf("%s\n",str);} 程序运行后的输出结果是______。 A、abcdefgB、gfedcbaC、gbcdefaD、abedcfg 解析: 本程序的作是将字符串str倒序。 故本题答案为B。 18.有以下程序 voidswap1(intc0[],intc1[]) {intt; t=c0[0];c0[0]=c1[0];c1[0]=t;} voidswap2(int*c0,int*c1) {intt; t=*c0;*c0=*c1;*c1=t;} main() {inta[2]={3,5},b[2]={3,5}; swap1(a,a+1);swap2(&b[0],&b[1]); printf("%d%d%d%d\n",a[0],a[1],b[0],b[1]);} 程序运行后的输出结果是______。 A、3553B、5335C、3535D、5353 解析: 函数swap1、swap2的作用均为交换两个数。 主调函数"swap1(a,a+1)"使得数组a的首地址赋给形参c0[],使得c0指向a[0]所在的存储单元,a[1]的地址赋给形参c1[],使得c1指向a[1]所在的存储单元,故交换c0[0]与c1[0]后,a[0]与a[1]值也发生了变化;主调函数"swap2(&b[0],&b[1]);"起着同样的作用,使得指针变量c0指向了b[0]存储单元,c1指向了b[1]存储单元,并在swap2函数中发生了交换,所以b[0]、b[1]的值也发生变化,故本程序输出的结果是5353。 故本题答案为D。 19.有以下程序 main() { inta[3][2]={0},(*ptr)[2],i,j; for(i=0;i<2;i++){ptr=a+i;scanf("%d",ptr);ptr++;} for(i=0;i<3;i++) {for(j=0;j<2;j++)printf("%2d",a[i][j]); printf("\n");}} 若运行时输入: 123<回车>,则输出结果是______。 A、产生错误信息B、10C、12D、10 203020 000030 解析: 本题定义了一个二维数组a,又定义了一个指针变量ptr,它用于指向包含2个元素的一维数组,在第一个for循环中,语句"ptr=a+i;"用于将指针变量ptr指向第i行的数组元素,通过两次循环,分别给二维数组a的第0行的第1个元素和第1行的第1个元素赋了值1和2。 故本题答案为B。 20.有以下程序 point(char*p){p+=3;} main() {charb[4]={'a','b','c','d'},*p=b; point(p); printf("%c\n",*p);} 程序运行后的输出结果是______。 A、aB、bC、cD、d 解析: 本题考查的是指针变量对数组的引用。 本题答案为A。 21.若有以下说明和语句 intc[4][5],(*p)[5];p=c; 能够正确引用c数组元素的是______。 A、p+1B、*(p+3)C、*(p+1)+3D、*(p[0]+2) 解析: 本题考查的是数组元素的引用。 本题答案为D。 22.有以下程序 #include main() {inta[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL; *q=*(p+5); printf("%d%d\n",*p,*q);} 程序运行后的输出结果是______。 A、运行后报错B、66C、611D、510 解析: 此题考查的是指针变量赋值。 本题将指针q赋值为空,即指向了空地址,而对空地址所对应的内容赋值*q=*(p+5)是会出错的,所以输出结果会报错。 所以此题答案为A。 23.有以下程序 main() {inta=7,b=8,*p,*q,*r; p=&a;q=&b; r=p;p=q;q=r; printf("%d,%d,%d,%d\n",*p,*q,a,b);} 程序运行后的输出结果是______。 A、8,7,8,7B、7,8,7,8C、8,7,7,8D、7,8,8,7 解析: 此题考的是指针变量。 本题答案为C。 24.有以下程序 main() {charstr[][10]={"China","Beijing"},*p=str; printf("%s\n",p+10);} 程序运行后的输出结果是______。 A、ChinaB、BejingC、ngD、ing 解析: 此题考的是指向数组元素的指针变量。 p+10就指向了从首地址依次向后的第11个存储单元即字符B的地址,所以输出Beijing,故答案为B。 25.设有如下的程序段 charstr[]="Hello"; char*ptr;ptr=str; 执行完上面的程序段后,*(ptr+5)的值为______。 A、'o'B、'\0'C、不确定的值D、'o'的地址 解析: 本题的考查点是字符数组的结束标志。 故本题答案为B。 26.若已定义: inta[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是______。 A、p+1B、a+1C、a++D、++p 解析: 本题的考查点是数组地址的表示。 选项C中,数组名所表示的数组地址不能被重新赋值。 故本题答案为C。 27.已定义以下函数 fun(char*p2,char*p1) {while((*p2=*p1)! ='\0'){p1++;p2++;}} 函数的功能是______。 A、将p1所指字符串复制到p2所指内存空间B、将p1所指字符串的地址赋给指针p2 C、对p1和p2两个指针所指字符串进行比较 D、检查p1和p2两个指针所指字符串中是否有'\0' 解析: while((*p2=*p1)! ='\0'表示将p1所指向的值赋给*p2,即将p1所指字符串复制到p2所指内存空间。 在这里“*P2=*p1”是赋值操作,而不是比较是否相等,比较应当为双等号“==”。 所以B,C,D都不对。 故本题答案为A。 28.若有定义: int*p[3];,则以下叙述中正确的是______。 A、定义了一个基类型为int的指针变量p,该变量具有三个指针 B、定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针 C、定义了一个名为*p的整型数组,该数组含有三个int类型元素 D、定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素 解析: int*p[3]表示此数组是指针类型的,每个数组元素(指针变量)都可指向一个整型的指针变量。 故本题答案选B。 29.设有定义: inta,*pa=&a;以下scanf语句中能正确为变量a读入数据的是___。 A、scanf("%d",pa);B、scanf("%d",a); C、scanf("%d",&pa);D、scanf("%d",*pa); 解析: scanf函数可以用来输入任何类型的多个数据。 本题答案为A。 30.有以下程序 main() {charch[]="uvwxyz",*pc; pc=ch;printf("%c\n",*(pc+5));} 程序运行后的输出结果是______。 A、zB、0C、元素ch[5]的地址D、字符y的地址 解析: 本题中定义了一个字符串数组和指针,并将指针pc指向该数组的首地址,语句中的*(pc+5)指的就是pc[5]的值,所以最后输出的结果为z。 故本题答案选A。 31.有以下函数 intfun(char*s) {char*t=s; while(*t++); return(t-s);} 该函数的功能是______。 A、比较两个字符串的大小B、计算s所指字符串占用内存字节的个数 C、计算s所指字符串的长度D、将s所指字符串复制到字符串t中 解析: 本题考查的是通过字符指针进行字符长度的计算。 故本题答案选C。 32.若有定义: char*x="abcdefghi";以下选项中正确运用了strcpy函数的是____。 A、chary[10];strcpy(y,x[4]);B、chary[10];strcpy(++y,&x[1]); C、chary[10],*s;strcpy(s=y+5,x);D、chary[10],*s;strcpy(s=y+1,x+1); 解析: 本题考查的是用于字符串处理的函数strcpy。 本题答案为D。 33.设有以下定义和语句 charstr[20]="Program",*p;p=str; 则以下叙述中正确的是______。 A、*P与str[0]中的值相等B、str与p的类型完全相同 C、str数组长度和p所指向的字符串长度相等 D、数组str中存放的内容和指针变量p中存放的内容相同 解析: 本题考查的是指针变量对数组的引用。 本题答案为A。 34.以下语句或语句组中,能正确进行字符串赋值的是______。 A、char*sp;*sp="right! ";B、chars[10];s="right! "; C、chars[10];*s="right! ";D、char*sp="right! ";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 习题 指针