gpt4 book ai didi

c++ - 将指针传递给指向函数的指针

转载 作者:太空狗 更新时间:2023-10-29 23:44:17 27 4
gpt4 key购买 nike

我想写一个函数,它接受两个指针并将一个指针设置为另一个指向的位置。

我的第一次尝试是这样的:

void func(int* i1, int* i2)
{
i2 = i1;
}

然后我意识到,我在这里传递指针地址,并将一个指针的地址设置为另一个指针的地址。像这样调用此函数会导致段错误:

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;

但究竟是为什么呢?如果 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;

效果很好...

通过研究我发现你可以改为这样做:

void func(int*& i1, int*& i2)
{
i2 = i1;
}

哪个会做我想做的...但是...它的语义是什么?

最佳答案

void func(int* i1, int* i2)
{
i2 = i1;
}

在这里,您按值传递了两个指针并将第一个指针分配给第二个指针。变量 i1i2 的作用域为 func 并且修改这些指针不会影响 func 之外的任何内容。

void func(int*& i1, int*& i2)
{
i2 = i1;
}

这里的指针是通过引用传递的,所以对它们的修改会影响传入的变量。

一开始考虑按值和引用传递指针似乎有违直觉,但这完全等同于传递一个 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
}

请注意,您不需要引用 i1,因为您不会修改它。通常最好按值传递内置类型。您还可以将其标记为 const 以防止您犯下愚蠢的错误:

void func(int* const i1, int*& i2)
{
i2 = i1;
}

关于c++ - 将指针传递给指向函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33077046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com