第 8 章 指 针 【练习8-1】如果有定义”int m, n = 5, *p = &m;”与 m = n 等价的语句是 B 。 A.m = *p; B. *p = *&n; C. m = &n; D. m = **p; 解答: A:p 是指向 m 的指针变量,所以*p 等价于 m。即 m=m。 B:&n 是 n 的地址,*&n 是 n 的值,即把 n 的值赋给 p 指向的值 m。即 m=n。 C:&n 是 n 的地址。即把 n 的地址赋给 m。 D:**p 是指 p 指向的指针所指向的值,在此无意义。 故选 B。 【练习8-2】调用函数求两个数的和与差:计算输入的两个数的和与差,要求自定义一个函数 sum_diff(float op1,float op2, float *psum, float *pdiff),其中 op1 和 op2 是输入的两个数,*psum 和*pdiff 是计算得出的和与差。 解答: #include void sum_diff(float op1,float op2,float *psum,float *pdiff); int main(void) { float op1,op2,sum,diff; printf("Input op1 and op2: "); scanf("%f%f",&op1,&op2); sum_diff(op1,op2,&sum,&diff); printf("%f+%f=%f;%f-%f=%f \n",op1,op2,sum,op1,op2,diff); return 0; } void sum_diff(float op1,float op2,float *psum,float *pdiff) { *psum=op1+op2; *pdiff=op1-op2; } 【练习8-3】两个相同类型的指针变量能不能相加?为什么? 解答: 不能。因为指针变量是一种特殊的变量,指针变量的值存放的是所指向变量的地址,两个地址相加并不能保证结果为一个有效的地址值,因而在 C 语言中指针变量相加是非法的。 【练习8-4】根据表 8.2 所示,这组数据的冒泡排序其实循环到第 6 遍(即 n-2)时就已经排好序了,说明有时候并不一定需要 n-1 次循环。请思考如何改进冒泡排序算法并编程实现(提示:当发现一遍循环后没有数据发生交换,说明已经排好序了)。 解答: 设置一个标志变量 flag,进入一轮循环前设置为 0,在循环中有发生数据交换就改写flag 值为 1。当该轮循环结束后检查 flag 值,如果变为 1 说明发生了数据交换,还没有排好序,如果为 0 说明没有发生交换,已经排好序。 #include void bubble (int a[],int n); int main(void) { int n,i,a[8]; printf("Enter n (n<=8):"); scanf("%d",&n); printf("Enter a[%d] : ",n); for(i=0;i