(1)首先我们定义一个函数swap,它的作用是交换两个变量a和b的值
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
swap 函数的两个形参p1和p2是指针变量
然后再写主函数
int main()
{
int a = 4, b = 6;
int *p3;
int *p4;
p3 = &a;
p4 = &b;
swap(p3, p4);
prinrtf(“a = %d, b = %d”,a, b);
return 0;
}
分析一下, main程序运行时,a和b的地址分别赋给p3和p4,使p3指向a,p4指向b。 然后进行值传递此时的实参p3和p4是指针变量,形参p1和实参p3都指向了变量a,形参p2和实参p4都指向了变量b,都是两个指针变量指向了同一个内存区域,都可以对内存里的值进行修改,然后执行swap函数,*p1和*p2的值互换,也就是a和b的值进行互换,函数执行完成后,形参被释放掉了,a的值与b的值也进行了交换。
如果下面着这种形式就不对了,int*temp定义了一个整形的指针变量,*temp是指针指向的变量,但是temp中并无确定值,所以temp所指向的单元也是不确定的,而*p1就是a,就是整形变量,所以不对。
void swap(int *p1, int *p2)
{
int*temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
再看下面这个函数
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
如果在main函数中掉用swap函数,那么a与b的值就不会被改变了,因为形参和实参的传递关系为单向传递,只能由实参传给形参。
了解了实参和形参的关系后,我们就可以很好的利用它们,为了使在函数中改变了的值能被main函数使用,我们不能采取把要改变值的变量作为参数的办法,而应该采用指针变量作为函数参数,这样经过函数调用后,这些变量值的变化依然可以保留下来 。