首先是C语言的参数传递机制,比如下面这样的一个简单函数
int plus(int a,int b){
return a+b;
}
//..
//其它函数中调用
z=plus(x,y);
这个函数调用的过程中会进行参数拷贝,也就是说上述代码会被编译成大致如下的样子(以下为伪代码)
int plus{
int a;int b;//函数的参数也是函数的内部变量
return a+b;
}
//...
//其它函数中调用
plus:a=x;//先将参数的值复制给被调用函数内部的参数
plus:b=y;//同上
z=plus()//执行函数
注意到上述过程中,所有函数的参数都是“复制”进去的,也就是说函数内部看见的参数并不是外部传入的参数本身,而是其副本,对副本进行操作(如交换)会失败,因为这些操作无法影响到外部的参数本身。
但如果使用指针传参,例如
void fun(int*a,int*b)//顺带一提,返回值一定要养成习惯写上
{int c;c=*a,*a=*b,*b=c}
//...
fun(&x,&y)
在编译的时候同样遵循参数复制原则,变成如下代码(以下为伪代码)
fun
{
int* a;int* b;//参数a,b仍然是函数的内部变量,不过其类型是int*
int c;c=*a,*a=*b,*b=c
}
//...
fun:a=&x;//将x的地址复制给a
fun:b=&y;//同上
fun();.//执行函数
可以看到,参数仍然是“复制”进去的,但要注意,传入的参数&x与其参数副本a虽然是两个东西,但他们是指针,存储的地址一样,也就是指向的对象时一样的(都是x),&y与b同理,因此在函数内部通过指针a,b寻址就可以访问函数外部的变量x,y,并对其进行交换操作
因为接收的是要更改数据地址,只有知道了地址才能改变地址所指向内容的值,
你好,
你一定是把fun(int *a, int *b)里面的*a,*b和下面函数内部的*a,*b混为一谈了,
int *a的意思是定义一个指针变量,这个指针变量是a而不是*a,
为什么要写成int *a而不写成int a呢?因为写成int a你就不知道它是个指针类型的变量了,
int *a里面的*号只是一个标志而已,就是为了告诉你a这个变量是指针类型的。
相信你一定在学指针吧,那老师一定说过,指针变量表示(指向)的是地址,也就是说这里的a是表示一个地址,那么函数里面的*a是什么呢?当然是a所对应的地址里面存放的东西咯。
再来看这个函数的意思:
c=*a;*a=*b;*b=c;
把a里面的东西给c,把b里面的东西给*a,把c给*b;相当于你我想互换东西,但是我们手里同时只能拿一样东西,所以我不能直接把我手里的东西给你,因为那样你手里就有两样东西了,于是我们找来另一个人帮忙,这里就是c,c同时也只能拿一样东西,现在c手里时空的,我把东西给c,然后你把东西给我,最后c把东西给你,于是我们就完成了互换东西。
希望可以帮到你。