指向 a,pointer_2 指向 b。
接着执行 if 语句,由于 a〈b,因此执行 swap 函数。注意实参 pointer_1 和 pointer_2 是
指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。
因此虚实结合后形参 p1 的值为&a,p2 的值为&b。这时 p1 和 pointer_1 指向变量 a,p2 和
pointer_2 指向变量 b。
接着执行执行 swap 函数的函数体使*p1 和*p2 的值互换,也就是使 a 和 b 的值互换。
谭浩强 C 语言程序设计 2001 年 5 月 1 日
函数调用结束后,p1 和 p2 不复存在(已释放)如图。
最后在 main 函数中输出的 a 和 b 的值是已经过jiāo换的值。
请注意jiāo换*p1 和*p2 的值是如何实现的。请找出下列程序段的错误:
swap(int *p1,int *p2)
{int *temp;
*temp=*p1; /*此语句有问题*/
*p1=*p2;
*p2=temp;
}
请考虑下面的函数能否实现实现 a 和 b 互换。
swap(int x,int y)
{int temp;
temp=x;
x=y;
y=temp;
}
如果在 main 函数中用“swap(a,b);”调用 swap 函数,会有什么结果呢?请看下图所示。
【例 10.4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。
swap(int *p1,int *p2)
{int *p;
p=p1;
p1=p2;
p2=p;
}
main()
{
int a,b;
int *pointer_1,*pointer_2;
scanf("%d,%d",&a,&b);
pointer_1=&a;pointer_2=&b;
谭浩强 C 语言程序设计 2001 年 5 月 1 日
if(a
printf("\n%d,%d\n",*pointer_1,*pointer_2);
}
其中的问题在于不能实现如图所示的第四步(d)。
【例 10.5】输入 a、b、c3 个整数,按大小顺序输出。
swap(int *pt1,int *pt2)
{int temp;
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
}
exchange(int *q1,int *q2,int *q3)
{ if(*q1<*q2)swap(q1,q2);
if(*q1<*q3)swap(q1,q3);
if(