一、值传递
值传递是啥,直接上代码
int change(int a,int b)
{
int c;
c=a;
a=b;
b=c;
}
定义了一个函数,传入2个值,交换这两个值。
看看能不能交换
int change(int a,int b)
{
int c;
c=a;
a=b;
b=c;
printf("函数内a=%d,b=%d\n",a,b);
}
int main()
{
int a=10;
int b=20;
change(a,b);
printf("函数外%d %d\n",a,b);
}
结果:不行
但函数内这两个值的确发生了变换,为啥函数结束后并没有改变原来的值呢?
因为在传参时,是把a和b的值赋值了一份,作为参数传进函数,对变量本身没有影响。
二、地址传递
地址传递,就是把变量的地址传进去。
int change2(int *a,int *b)
{
int c;
c=*a;
*a=*b;
*b=c;
}
int main()
{
int a=10;
int b=20;
printf("%d %d\n",a,b);
change2(&a,&b);///参数为指针,直接传递地址
printf("%d %d\n",a,b);
}
参数列表中的int *a,int *b,定义了指针a,b,其实就是地址。
函数内赋值运算时为啥用*a,*b呢,我之前的文章说过,这个*在赋值运算时相当于解引用,相当于把地址中的内容拿出来。
https://blog.youkuaiyun.com/qq_37040743/article/details/127563999?spm=1001.2014.3001.5502
在主函数中,因为函数的参数是2个地址,传参的时候也要传地址,所以用&去取地址,作为参数传入。
结果:变量实现了交换
3、引用传递
int change3(int &a,int &b)
{
int c;
c=a;
a=b;
b=c;
}
int main()
{
int a=10;
int b=20;
printf("%d %d\n",a,b);
change3(a,b);///把变量自身直接传入
printf("%d %d\n",a,b);
}
引用传递想干啥呢
先看一下定义:
在C++中,函数参数的传递方式有引用传递。所谓引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
在值传递中,把变量复制了一份传进去,引用传递就想能不能把变量本身传进去,其实也相当于把地址传了进去,在主函数传参时,直接用变量本身作为函数参数。