首先要清楚什么叫函数的形参和实参。
形参:任何函数实现的参数都是形参。
实参:调用函数时候,传入的参数是实参。
实参可以给形参传参,形参不能够给实参传参。
#include <stdio.h>
void exchange(int a,int b)
{
int t;
printf("&a = %p,&b = %p\n",&a,&b );
t = a;
a = b;
b = t;
printf("a = %d,b = %d\n",a,b );
}
int main(int argc, char const *argv[])
{
int m = 10;
int n = 20;
exchange(m,n);
printf("&m = %p,&n = %p\n",&m,&n );
printf("m = %d,n = %d\n",m,n );
return 0;
}
上述代码,exchange中的a,b是形参,m,n是实参。
可以看出在exchange中,a,b和main函数中的m,n并不是同一块地址。
此时调用exchange的时候,传入的m,n就是实参,只是把值传入进入了。
在exchange函数中m,n的值并没有改变,改变的只是a,b的值。exchange函数执行完成后,局部函数释放。对于m,n的值并没有造成实质的影响。所谓值传递,只是传递值进去。只是传递值而已,仅此而已。有时间再配图。
那么如果想改变m,n的值怎么做尼?下面代码示例一下c语言的实现方法,那就是传递指针,也叫地址传递、C语言相对麻烦一点,但是熟练后都一样。用c++的话直接饮用就可以了。
c代码实现交换函数:
#include <stdio.h>
void exchange(int *a,int *b)
{
int t;
printf("&a = %p,&b = %p\n",&a,&b );
t = *a;
*a = *b;
*b = t;
printf("*a = %d,*b = %d\n",*a,*b );
}
int main(int argc, char const *argv[])
{
int m = 10;
int n = 20;
exchange(&m,&n);
printf("&m = %p,&n = %p\n",&m,&n );
printf("m = %d,n = %d\n",m,n );
return 0;
}
上述代码可以看出。交换函数中的形参是指针。然后操作的是指针指向的内容。吧指针的内容改变了。
也可以这么干,如果不容易理解。指针保存的就是变量的地址。取地址就是指针。等同的。