lo *_*cre 2 c++ pointers pass-by-reference
我想编写一个函数,它接受两个指针并将一个指针设置为另一个指向的位置.
我的第一次尝试是这样的:
void func(int* i1, int* i2)
{
i2 = i1;
}
Run Code Online (Sandbox Code Playgroud)
然后我意识到,我在这里传递指针地址,并将一个指针的地址设置为另一个地址.像这样调用此函数会导致段错误:
int * int_ptr_1;
int * int_ptr_2 = nullptr;
int a = 5;
int_ptr_1 = &a;
func(int_ptr_1, int_ptr_2);
std::cout << *int_ptr_2 << std::endl;
Run Code Online (Sandbox Code Playgroud)
但为什么呢?如果地址int_ptr_2现在与地址相同int_ptr_1,为什么解除引用int_ptr_2不会产生5... int_ptr_1指向a,其值为5......
这样做有什么不同?:
int * int_ptr_1;
int * int_ptr_2;
int a = 5;
int_ptr_1 = &a;
int_ptr_2 = int_ptr_1;
Run Code Online (Sandbox Code Playgroud)
工作得很好......
通过研究我发现你可以这样做:
void func(int*& i1, int*& i2)
{
i2 = i1;
}
Run Code Online (Sandbox Code Playgroud)
这将做我想要的......但是......无论如何,它的语义是什么?
void func(int* i1, int* i2)
{
i2 = i1;
}
Run Code Online (Sandbox Code Playgroud)
在这里,您按值传递两个指针,并将第一个指定给第二个指针.变量i1和i2作用域func并修改这些指针不会影响任何外部的任何内容func.
void func(int*& i1, int*& i2)
{
i2 = i1;
}
Run Code Online (Sandbox Code Playgroud)
这里的指针是通过引用传递的,因此对它们的修改将影响传入的变量.
一开始考虑通过值和引用传递指针似乎是违反直觉的,但它完全等同于传递,比如说int.
void func(int i1, int i2)
{
i2 = i1; //change only affects func
}
void func(int& i1, int& i2)
{
i2 = i1; //change affects variables passed in
}
Run Code Online (Sandbox Code Playgroud)
请注意,您不需要i1通过引用,因为您不会修改它.通常最好按值传递内置类型.你也可以用它const来阻止你犯下愚蠢的错误:
void func(int* const i1, int*& i2)
{
i2 = i1;
}
Run Code Online (Sandbox Code Playgroud)