C语言第六章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第六章习题解析一、选择题1.答案选择:A分析:intn1=0,n2,*p=&n2,*q=&n1;首先定义了两个整型变量n1和n2,并为n1赋值为0,定义了两个指针变脸p和q,p指向了n2的地址,q指向了n1的地址。可以用“间接访问运算符”来引用相应的存储单元,因此*p就是n2的值,*q就是n1的值。与n2=n1等价的就是*p=*q,故选择A答案。2.答案选择:B分析:intx=0,*p=&x;printf(“%d\n”,*p);输出*p的值,首先p指向了x的地址,*p将输出x的值为0。3.答案选择:C分析:A答案chara=’A’b=’B’,定义了两个char类型的变量,并为它们赋初始值。定义两个及多个变量时,变量中间用逗号隔开作为分隔,A选项中变量a和b中间没有逗号,因此出错。B答案floata=b=10.0;定义个变量a,但是不能定义变量b,那么将10.0赋值给变量b就违背了变量“先定义,后使用”的原则。floata,b;a=b=10.0;这样才对。C答案inta=10,*b=&a;定义了一个整型变量a和指针变量b,指针b指向了a的地址,因此C答案是正确的。D答案float*a,b=&a;定义了一个指针变量a和变量b,b被赋值为a的地址。普通变量不能接受地址,因此b=&a的形式是错误的。4.答案选择:C分析: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和b,,分别赋值为7和8,定义了三个指针变量p,q,r,其中p指向了a的地址,q指向了b的地址。其次,r=p;p=q;q=r;这是典型的交换,在题目中表示指针p和q的互换,p指向了变量b的地址,q指向了变量a的地址。但是注意一点:虽然指针p和q互换但是变量a和b的值并没有互换,a的值是7,b的值是8。如果要互换a和b的值,将函数中的r=p;p=q;q=r;改为*r=*p;*p=*q;*q=*r;即可。第三输出:*p的值为8,*q的值为7,a的值为7,b的值为8,选择C答案。5.答案选择:C分析:void*fun(){}首先函数返回的是一个地址,地址的类型是void是空,我们称这种返回的类型为无值型的指针类型。6.答案选择:A分析:inta,*pa=&a;指针pa执行了a的地址,简单的说就是pa等价于&a。题目中要求使用scanf语句能正确为变量a读入数据。利用我们以前学过的知识,如果要给变量a输入数据,其形式为:scanf(“%d”,&a);结合指针的知识点可以有另外的一种形式,因为pa等价于&a,那么scanf(“%d”,&a);可以换为scanf(“%d”,pa);故答案选择A。7.答案选择:D分析:intn=0,*p=&n,**q=&p;定义了一个普通变量n赋初始值为0,一个一维指针p指向了n的地址,一个二维指针q指向了p的地址。A答案p=1,将常量1赋值给一维指针是错误的,类型不一致。B答案*q=2,因为q是二维指针,因此*q可以理解为一维的指针,将2赋值给*q类型不一致。C答案q=p,q和q的类型不一致,因此不能直接赋值。D答案*p=5,p是一维指针,*p就相当于一个普通变量,因此可以将5赋值给*p。8.答案选择:C分析:考查函数的调用和局部变量的使用,看下面的函数,用红色方框框住的”inta=2”对于整个程序来说是全局的,因此在这里我们把它叫做“全局变量”,用红圆圈圈住的部分“inta=5”在main函数中,那么它的有效范围仅仅在main函数中,由于“inta=5;s=f(&a)”用大括号括起来了,因此“inta=5”仅仅在main函数中的大括号中有效,把它叫做“局部变量”。(1)函数从main函数开始执行,定义了一个整型变量s赋值为0,执行“inta=5;s=f(&a)”,调用f函数,此时的实参a是指“局部变量”a,值为5。(2)执行调用函数f,那么形参a的值为实参a的地址,*a的值为5,返回(*a)++表达式的值为5。(3)执行完调用函数后s的值为函数返回值为5,继续执行s+=f(&a),此时的实参a是指“全局变量”a,值为2。(4)执行调用函数f,那么形参a的值为实参a的地址,*a的值为2,返回(*a)++表达式的值为2。(5)继续执行s+=2,那么s的值为79.答案选择:A分析:voidfun(char*a,char*b){a=b;(*a)++;}main(){charc1='A',c2='a',*p1,*p2;p1=&c1,p2=&c2;fun(p1,p2);printf(%c%c\n,c1,c2);}(1)从main函数开始执行,其中p1指针指向了变量c1的地址,指针p2指向了变量c2的地址,调用函数fun(p1,p2),此时实参为两个指针,因此传入的是地址。(2)执行调用函数,那么形参a和b也分别指向变量c1和c2的地址,执行:a=b,指针a指向了指针b指向的存储单元,就是指向了c2。(*a)++相当于变量c2++,即变量c2的值变为了‘b’。fun函数执行完毕。(3)继续执行main函数中调用函数以后的语句,输出c1和c2的值为:Ab10.答案选择:A分析:printf(“%d\n”,NULL);输出NULL的值,在库函数“stdio.h”中,NULL表示空,值为0。如果不包含“stdio.h”头文件,将不能通过编译,得不到正确结果。11.答案选择:C分析:return*p;将返回p所指存储单元中的值。12.答案选择:B分析:考查函数的定义。B答案intmax(intx,y)中参数有两个x和y,其中x的类型为int,但是参数没有指定类型,因此是错误的。考点:定义函数时,一定要指定参数的类型。A,C,D答案没有错误。13.答案选择:C分析:inta=5,*b,**c;c=&b;b=&a;二维指针c指向了一维指针b的地址,一维指针b指向了变量a的地址。*c将得到一维指针b的值,就是变量a的地址,**c将得到变量a的值。14.答案选择:A分析:#include“stdio.h”main(){inta=4,b=3,*p,*q,*w;p=&a;q=&b;w=q;q=NULL;}q指向了NULL为空,不能再去访问其它的存储单元。A答案中*q=0,将出现错误,可以通过编译但是不能正确执行。15.答案选择:B分析:int*f(int*x,int*y){if(*x*y)returnx;elxereturny;}main(){inta=7,b=8,*p,*q,*r;p=&a,q=&b;r=f(p,q);printf(%d,%d,%d\n,*p,*q,*r);}16.答案选择:D分析:答案D中p=n,p是一维指针,n是普通变量,将变量赋值给指针,类型不一致因此是错误的。17.答案选择:D分析:voidfun(char*c,intc){*c=*c+1;d=d+1;printf(%c,%c,,*c,c);}main(){chara='A',b='a';fun(&b,a);printf(%c,%c\n,a,b);}18.答案选择:D分析:inta=511,*b=&a;输出*b的值,首先指针b指向了a的地址,*b将输出变量a的值为511。19.答案选择:C分析:inta=1,b=3,c=5;int*p1=&a,*p2=&b,*p=&c;p1指向了a的地址,p2指向了b的地址,p指向了c的地址。*p=*p1*(*p2);计算*p1和*p2的乘积,注意中间的*号表示乘号。即*p=1*3值为3,由于p指向了c的地址,*p的值为3那么c的值为3。20.答案选择:C分析:intfun1(doublea){returna*=a;}intfun2(doublex,doubley){doublea=0,b=0;a=fun1(x);b=fun2(y);return(int)(a+b);}main(){doublew;w=fun(1.1,2.0);}首先函数总是从main函数开始执行,在main函数中定义了一个变量w,w用来接收函数的返回值。调用fun2(1.1,2.0)。其次,执行函数fun2,参数x的值为1.1,参数y的值为2.0。执行函数体:定义了两个变量a和b,a=fun1(1.1)第三,执行函数fun1,那么a的值为1.1,返回a*=a,那么a的值为1.21,由于fun1函数返回的类型为int,而a的值是1.21,那么返回的值为1。第四,继续执行fun2函数,那么a=1.0,b=fun1(2)第五,执行函数fun1(2),那么a的值为2.0,返回a*=a,那么a的值为4.0,由于fun1函数返回的类型为int,而a的值是4.0,那么返回的值为4。第六,继续执行fun2函数,那么a=1.0,b=4.0,返回(int)(a+b),值为5第七,执行main函数的函数体,那么w的值为5,由于w是double的类型,那么w的值为5.0。21.答案选择:A分析:intfun(intn){if(n==1)return1;elsereturn(n+fun(n-1));}main(){intx;scanf(%d,&x);x=fun(x);printf(%d\n,x);}22.答案选择:D分析:intn=0,*p=&n,**q=&p;一维指针p指向了n的地址,二维指针q指向了指针p的地址。A答案p=1,类型不一致,左边p是一维指针,右边是值B答案*q=2,类型不一致,左边*q获得一维指针的值,是变量n的地址。将常量2赋值给*q,相当于将一个值赋值给一个地址,因此是错误的。C答案q=p,q是二维指针,p是一维指针,因此类型不一致。D答案*p=5,p是一维指针,将常量5赋值给指针变量p所指向的变量n。23.答案选择:D分析:A答案float*p=1024,将一个常量1024赋值给指针,赋值号两边的类型错误。B答案int*p=(floatx);将一个float类型的变量x赋值给指针变量p是错误的。C答案floatp=&x;将x的地址赋值给变量p是错误的。D答案float*p=&x;将变量x的地址赋值给指针p,因此是正确的。24.答案选择:C分析:可以给指针变量赋值一个整数作为地址值,是一个错误的概念。25.答案选择:C分析:inta,b,c,*p=&c;指针p指向了c的地址,p相当于&c。A答案scanf(“%d”,a,b,c),%d对应的是参数列表中的变量a,必须在a的前面加上取地址符号&,scanf(“%d”,&a,b,c)才对。B答案scanf(“%d%d%d”,a,b,c)改为scanf(“%d%d%d”,&a,&b,&c)才对。C答案scanf(“%d”,p)相当于scanf(“%d”,&c);D答案scanf(“%d”,&p)改为scanf(“%d”,p)。26.答案选择:D分析:A答案错误的原因,变量b没有定义B答案错误的原因,charA=65+1,b=’ab’,ab是两个字符不能用单引号引起来。C答案floata=1,*b=&a,*c=&b,c是一维指针不能存储一维指针b的地址。D答案正确。27.答案选择:D分析:chars[]=”abcd”;s+=2;s是一个存储字符串的数组,s表示数组的首地址,数组的首地址是地址常量,不能进行自加之类的运算。28.答案选择:A分析:通过一个空指针去访问一个存储单元时,将会得到一个出错信息。二、填空题1.答案:84分析:voidf(inty,int*x){y=y+*x;*x=*x+y;}main(){intx=2,y=4;f(y,&x);printf(“%d%d\n”,x,y);}(1)首先函数从main函数开始执行,在main函数中定义了两个变量x=2,y=4,调用函数f(y,&x),这里传入的一个是y的值,一个是x的地址。(2)执行函数f,形参y的值为4,x指针指向实参x的地址。执行:y=y+*x,那么y=4+2,值为6,*x=*x+y那么*x=2+6,由于调用函数传入的是地址,因此形参*x的值变

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功