C语言程序设计 (何钦铭 颜晖 著) 浙江科学技术出版社 习题7 课后答案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题参考答案 习题七
1. 选择题
(1) A(g=p=&ch, 指针 p 是 int 型,不能指向字符变量 ch),D(g=p,指针类型不同,不能互相赋值) (2) B(取地址运算&的后面只能跟变量,而 x+1 不是变量) (3) C (4) D(即输出 m,n, m=m+n, m=m+n, 要注意的是,书中给出的答案中 D 是先输出 m,n 的初值,再输出 m
7——*p+2~x+2: 5+2 5——**&p~*(*&p)~*p~x :5 15——3**p~3*(*p)~3*x: 3*5 1245068——p+4, 已知 p=0x12ff7c=1245052, p 是整型指针,每个整型变量占 4 个字节,p+4 代表增加 4 个整型变量所占的空间 4×4=16Bytes,故 p+4=1245052+4*4=1245068
//0:a b c 按降序输出,即让 p1 指向最大者,p2 指向次大者;p3 指向最小者
if( choice==0){
if( *p1<*p2 ) { pt=p1; p1=p2; p2=pt;}
//使 p1 指向 a,b 中的较大者
if( *p1<*p3 ) { pt=p1; p1=p3; p3=pt;}
对调实参 x,y) (4) Max=4, 4, 3(本题采用传地址的方式 Max(&a,&b) ,但 Max 中只是对调了形参指针 a,b 所指的变量,
即令 a 指向 y, b 指向 x, 但变量 x,y 的值未进行对调) (5) 0012FF7C,7,5,15,1245068
0012FF7C(十六进制形式的绝对地址,对应的格式说明为”%p”,转成十进制等于 1245052)——p ~&x: 变 量 x 的地址;
6. /*输入 3 个数 a b c, 然后输入 0 或 1:若输入 0,这三个数按降序输出;若输入 1,这三个数按升序输出 */ #include<stdio.h> void main() {
double a,b,c, *p1=&a,*p2=&b,*p3=&c,*pt; int choice;
wenku.baidu.com
//输入 a b c printf(“Input a b c:”); scanf(“%lf%lf%lf”,&a,&b,&c); //输入选择 0 或 1 printf(“Input 0 or 1:”); scanf(“%d”,&choice);
*q=7-5-3; --warning!q 事先未指向某个变量
5. /*编写形参为指针变量的函数 swap(),功能是交换两个数的值 */
void swap(double *p, double *q) {
double temp;
//无 return ,故函数类型是无返回值型 void
tep=*p; *p=*q; *q=temp; }
if( choice==0){ if( *p1>*p2 ) { if( *p1>*p3 ) {
pt=p1; p1=p2; p2=pt;} pt=p1; p1=p3; p3=pt;}
//使 p1 指向 a,b 中的较小者 //使 p1 指向 a,b,c 中的最小者
//此时,p2,p3 指向三个数中的次小或最大者,下面调整这两个指针,使 p2 指向次小者,p3 指向最大者
//使 p1 指向 a,b,c 中的最大者
//此时,p2,p3 指向三个数中的次大或最小者,下面调整这两个指针,使 p2 指向次大者,p3 指向最小者
if( *p2<*p3) { pt=p2; p2=p3; p3=pt;}
}
//1:a b c 按升序输出,即让 p1 指向最小者,p2 指向次小者;p3 指向最大者
int *p=Number; //error! printf("The Number is %d\n", *p); } ——Number 是符号常量,即 777, 初始化语句 int *p=Number 相当于: int *p; p=777; 而对指针变量赋用整数表示的绝对地址,该整数地址之前必须加前缀(指针类型*),即应改为: int *p=(int*) Number;
3. /*内存变化图”。*/
c1 ‘A’ char *p=&ch1, *q=&ch2;
p
c2 ‘B’ q
temp=*p; *p=*q; *q=temp;
temp ‘A’ c1 ‘B’ c2 ‘A’
p
q
4. /*找错误 */
double *p,*q;
p=3;
--error!应当改为 p=(int*)
if( *p2>*p3) { pt=p2; p2=p3; p3=pt;}
}
//依次输出 p1 p2 p3 所指向的变量 printf(“ %d %d %d \n”, *p1,*p2,*p3); }
7. /*找出程序中的错误,并说明理由 */ #include<stdio.h> #define Number 777 void main() {
2. /*写程序段的输出结果*/ (1) 9, 20, 30 (注意在调用函数 change 时,实参 a 是传地址&a, 在函数中对形参 a 的改动就相当于对实参 a 的改动,即 a 减 1: 10—>9;而实参 b 是传值,因此在函数 change 中对 b 增 1,但回到主函数后,实参 b 的值不受其影响,仍保持为 20;而 main()中的 c 和 change()中的 c 是不同的两个变量,在 change 中 c 的任何修改与 main 中的 c 无关。) (2) Max=4, 4,3 (本题采用传值的方式 Max(a,b) ,因此 Max 中对调形参 a,b 对实参 x,y 无影响) (3) Max=4, 3, 4(本题采用传地址的方式 Max(&a,&b) ,因此 Max 中对调形参 a,b 所指变量的值,相当于
更改后的值;但在 VC 中并不正确,实际运行结果是 5 2 3 5,即先计算整个逗号表达式,即 m 增加两次, 然后再输出 m,n,m,m 的值) (5) D (6) A(对指针直接赋用整数代表的绝对地址,在整数之前要加(指针类型*),即 p=(int*) 0xfff ) (7) D (相当于 *&x 就是 x, 故 D 相当于 p2=x) (8) B(p=&*&n~ p=&n√ ,但 n=(*&)m×,因为单目运算符&*不能用()括起来,否则无操作数)
相关文档
最新文档