将指针传递给指向函数的指针

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)

这将做我想要的......但是......无论如何,它的语义是什么?

Tar*_*ama 7

void func(int* i1, int* i2)
{
    i2 = i1;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您按值传递两个指针,并将第一个指定给第二个指针.变量i1i2作用域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)

  • 我还要补充一点,这可以通过指向指针来实现,AKA`int**i1`虽然有更多的C语法 (2认同)