#include<stdio.h>
void swap(int*a,int*b)
{
int*t;
t=a;a=b;b=t;
}
main()
{
int i=3,j=5,*p=&i,*q=&j;
swap(p,q);
printf("%d %d\n",*p,*q);
}
输出结果为什么是3 5,而不是交换后的5 3?
在swap函数中指针a、b的地址发生了互换,即指针p、q的地址也发生了互换,最后输出*p和*q应该分别是j和i(5 3)才对啊…
c语言中形参与实参的关系是:形参是实参的值副本。无论参数的类型是什么,传递到子函数中的形参只是实参的值。所以,在改变形参变量自身的值时,是与实参无关的。换句话说,形参的改变不会影响到实参。
但,如果参数类型是指针类型,则可以通过对指针变量所指向的地址中的数据进行修改,达到改变实参地址中的数据目的。
因此,使用SWAP函数进行数据交换时,必须保证两点:
参数必须是指针类型,指向待交换的数据
交换时,必须交换地址中的数据,而不是交换地址本身。
参考代码:
//错误的交换代码1你的意思是swap的形参a、b不能影响实参p、q的意思吗?
追答你要抓住形参的值只是实参的一个副本,你改变其本身是不能实现交换的!
如果你是这样int t; t = *a; *a = *b; *b = t;你交换的就是地址所对应的值也就是i和j的值。
此时指针a和p指向的还是i的地址,只不过i地址里面存放的是j的值了。j同理!