资源描述:
《c语言内涵教程练习9参考答案》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、9.1存储单元的地址仅表明其首字节在内存中的位置,只有地址无法确定相关储存单元的大小及编码格式。只有知道了类型,才能确定相关存储单元的大小及编码格式,才能使用存储单元,因此,有类型的地址可以确定存储单元。9.2整型变量存储整数,指针变量存储地址。指针与内存地址的关系似乎更像整型与整数的关系。准确地说,指针变量存储的是存储单元的地址而并非简单的内存地址。简单的内存地址可以看成一个整数,但存储单元的地址应理解成具有类型的地址。9.3地址是整数,但整数不是地址。多次强调,存储单元的地址有类型,而指针变量也只能用
2、规定类型的存储单元的地址赋值。更进一步,指针变量只能指向程序拥有的存储单元。因此,通常不能用整数给指针变量赋值。理论上不可以,只有同类型间的指针变量才可以相互赋值,但实际上C语言追求效率,不保证类型安全,有些C语言编译系统“允许”不同类型的指针变量之间相互赋值。即使单精度指针变量pf真的指向了整型变量i,通过*pf使用变量i的存储单元也没有太大的实际意义。9.4不等价。double*p=&lf;是初始化语句,定义了一个双精度指针变量p,并且它被赋值为变量lf的地址;语句*p=&lf;是赋值语句,把变量lf
3、的地址赋值给指针变量p指向的存储单元,这条语句有两个问题,首先指针变量p没有指向合法的存储单元,不能以间接引用*p的方式使用非法的存储单元,其次,*p标识存储单元的类型为双精度,不能接受变量lf的地址,两者类型不匹配。double*p=&lf;的作用等同于double*p;p=&lf;。9.5程序的运行结果为:因为语句printf(“%x”,-5);的输出结果为fffffffb,所以变量i实际的内存状态和简化后的内存状态如下:变量pi与变量i的关系如下:9.6指针变量用于存储某类型存储单元的地址,而存储单
4、元的地址在VC6.0中均为32位,因此,无论何种类型的指针变量,其长度均为4个字节。sizeof(pf)的值为指针变量pf本身的长度,长度为4个字节。sizeof(*pf)的值为指针变量pf指向的存储单元的长度,即双精度型存储单元的长度,为8个字节。9.7不能用整型变量给整型指针变量赋值。可修改为:pi=&i;或pi=(int*)i;。9.8程序中指针变量p1指向了整型变量i,而语句p2=p1;使得指针变量p2也指向了整型变量i。因为*p1和*p2也标识了变量i相关的存储单元,所以语句i=*p1+*p2;
5、相当于i=i+i;,语句执行后,变量i的值变为6。最终程序的输出结果为:6,6,6。9.9C语言中使用存储单元有直接引用和间接引用两种方法。对于指针变量p,语句p=&i;为指针变量p赋值为变量i的地址,实际上是使用直接引用的方式使用了指针变量p本身的存储单元。语句*p=23;就是所谓的以间接引用的方式使用指针变量p指向的存储单元。理论上,只要指针变量指向了某存储单元,就可以通过间接引用的方式使用该存储单元,但实际上为避免出现错误,应保证通过间接引用方式只使用合法的存储单元。表达式p标识一个可以存储某类存储
6、单元地址的存储单元,表达式*p标识p指向的存储单元。9.10pi不是空指针!程序的输出结果为:可见在VC6.0中,没有赋值的局部指针变量会被赋值为0xcccccccc。9.11(1)无问题。(2)无问题。(3)有问题,其中p2=*p1;错误,不能用整型变量给指针变量赋值。。(4)有问题,指针变量p1指向了非法的存储单元,语句*p1=*p2;中使用了非法的存储单元。(5)无问题。(6)有问题。指针变量p1只能用整型地址赋值,语句p1=&p2;中&p2的结果并非整型地址而是整型指针地址。9.12程序的运行结果
7、为:a=1,b=7m=6,n=9分析如下:语句a=p1==&m;中p1==&m先求值,因为指针变量p1指向了整型变量m,故求值结果为真,值为1,原语句变为a=1;。在语句b=(++*p1)/(*p2)+5;中,*p1标识了变量m相关的存储单元,即其可与m互换,*p2可与n互换,原语句可变为b=(++m)/n+5;,变量b被赋值为7,且变量m自增1后变为6。语句n=*p1+*p2;可变为n=m+n;即n=6+3;。9.13(1)#includevoidmain(){inta,b,c,*pa
8、=&a,*pb=&b,*pc=&c,t;printf("请输入三个整数!");scanf("%d%d%d",pa,pb,pc);if(*pa>*pb){t=*pa;*pa=*pb;*pb=t;}if(*pb>*pc){t=*pb;*pb=*pc;*pc=t;if(*pa>*pb){t=*pa;*pa=*pb;*pb=t;}}printf("a=%d,b=%d,c=%d",a,b,c);}(2)#include