一、传值调用
函数的形参和实参占有不同的内存块,对形参的修改不会影响实参。
形参是实参的一份拷贝,函数运行起来后,形参是形参,实参是实参,形参和实参没有任何关联性,改变形参时,不会对实参造成任何影响。
二、传址调用
形参是实参地址的一份拷贝,形参指向的实体是实参,对形参解引用后,拿到的内容就是实参,因此对形参解引用之后的内容进行修改,改变的就是实参。
三、实例 传址调用
//写一个函数实现两个数的交换
#include <stdio.h>
void Swap(int *x,int *y)
{
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 0;
int b = 0;
scanf_s("%d %d", &a, &b);
Swap(&a, &b);
printf("%d %d", a, b);
return 0;
}
先输入a,b的值分别为7,8
在监视窗口中,我们可以看出&a=0x0113fc90,&b=0x0113fc84
x放的是a的地址,y放的是b的地址,即x=&a,y=&b;
*x,*y则是该地址所含的内容,所以*x=8,*y=7;
*x和*y两个内容交换后
最终实现两个数的交换
错误示例
void Swap(int x,int y)
{
int temp = 0;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 0;
int b = 0;
scanf_s("%d %d", &a, &b);
Swap(a, b);
printf("%d %d", a, b);
return 0;
}
从上述两张图片对比可知,a和b,x和y指向的空间不同。即对应地址不同,所以对xy的值进行修改时,无法影响ab的值。
三、总结
对于一个函数是需要传值还是传址,一定要明确形参和实参之间的关系,形参的改变是否要影响实参非常重要。