先上结论:
函数内部修改外部变量的值,需要一重指针传递该变量的地址;
函数内部修改外部一重指针变量的值,需要二重指针传递一重指针自身的地址;
如果传递变量的值或者一重指针的值,函数内部则会新建临时变量接收值,而无法改变外部变量的值。
参考博客
1、函数传参之变量与一重指针
要理解函数传参的机制及其原理,就不得不先了解地址与值的概念。
地址是一个变量在内存中的位置,值是该地址对应的值。
地址是变量的key,是其在内存中的索引,值是变量的value。
变量值传递的例子:
void main(){
int a = 4,b = 6;
Exchange(a, b);
print("a = %d,b = %d\n", a, b);
}
void Exchange(int x, int y){
int temp = x;
x=y;
y=temp;
print("x = %d,y = %d\n", x, y);
}
输出结果是
a = 4,b = 6
x = 6,y = 4;
a,b的值并没有交换。这是因为Exchange函数中新建了两个临时变量用于接收a,b的值。
如果想改变函数外部的值,即main中a,b的值,必须要传递a,b的地址,比如通过一重指针的地址传递 Exchange(int* x, int* y)或者引用传递 Exchange(int& x, int& y)。通过传递变量的地址给子函数,地址key对应的value值发生改变,才会改变main函数中变量的值。
结论:只传递变量的值给子函数,则子函数会新建临时变量(新的地址)用于接收变量的值,不管新地址对应的值如何改变都不会改变原变量的值。
函数传参具体可以参考这篇博客https://blog.youkuaiyun.com/qq_28657577/article/details/80424786
2、函数传参之一重指针与二重指针
当变量为一重指针,想要改变外部一重指针的值则必须通过二重指针。
一重指针的值即为该指针指向的地址,改变一重指针的值,即将指针指向另一个变量或为其分配新的内存空间。
void main(){
int* p;
Func1(p); //传递指针p的值
Func2(&p); //传递指针p自身地址
}
Func1(int* a)
{
a=new int();
}
Func2(int** a)
{
(*a)=new int();
}