C语言习题十指针.docx

上传人:b****6 文档编号:6507510 上传时间:2023-01-07 格式:DOCX 页数:14 大小:23.91KB
下载 相关 举报
C语言习题十指针.docx_第1页
第1页 / 共14页
C语言习题十指针.docx_第2页
第2页 / 共14页
C语言习题十指针.docx_第3页
第3页 / 共14页
C语言习题十指针.docx_第4页
第4页 / 共14页
C语言习题十指针.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

C语言习题十指针.docx

《C语言习题十指针.docx》由会员分享,可在线阅读,更多相关《C语言习题十指针.docx(14页珍藏版)》请在冰豆网上搜索。

C语言习题十指针.docx

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!

";

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 面试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1