【问题标题】:Passing Pointers By Reference vs Passing Pointers Into Functions通过引用传递指针与将指针传递给函数
【发布时间】:2019-09-16 09:12:44
【问题描述】:

我已经有一段时间没有用 C++ 编写任何东西了。当我作为 CIS Tutor 试图帮助另一个人时,他想知道为什么在指向 int 的指针旁边有一个 & 符号是必要的。

我想如果你通过引用传递一个指针并且你指向别的东西,主知道在你传递之后 val 将等于你设置它等于的任何值。

下面会有一个例子来说明我想说的话。

这是正确的吗?

//main function
int variable = 0;
int* val = &variable;
function1(val);
cout << *val << endl;
function2(val);
cout << *val << endl;
//Passing in a pointer with reference.
void function1(int*& value)
{
    int variable = 9;
    value = &variable;
}

//Passing in a pointer without reference.
void function2(int* val)
{
    int variable = 9;
    value = &variable;
}

我的假设是程序将输出 9 而不是 8 或 0。我希望这能让你们清楚地了解我想要问的问题。

【问题讨论】:

  • *指向原型中的 int 的指针
  • 你在问为什么一个函数会有像void function1(int*&amp; value)这样的签名?
  • 你的function1 坏了。调用者将留下val 作为悬空指针
  • 函数 2 已损坏 - 没有所谓的 'value',参数是 'val'。在提交之前编译 minimal reproducible example 总是好的。
  • @NathanOliver 是的。

标签: c++ function pointers reference prototype


【解决方案1】:

传递值和传递引用之间的区别对于指针和其他值是一样的(实际上指针并没有什么特别之处,它们只是保存有时是其他对象地址的数字)。

int:

void foo(int x) { x = 1; }
void bar(int& x) { x = 2; }

int main() {
    int y = 5;
    foo(y);
    std::cout << y; // prints 5
    bar(y); 
    std::cout << y; // prints 2
}

现在有了指针:

void foo(int* x) { x = 0; }
void bar(int*& x) { x = 0; }

int main() {
     int y = 42;
     int* z = &y;
     foo(z);     
     std::cout << z; // prints the address of y
     bar(z); 
     std::cout << z; // prints 0
}

请注意,您的 function1 已损坏,因为当您调用它时

int* y;
function1(y);
std::cout << *y;    // **baaam**
                    // the value y points to is already gone

函数内部的int 在函数返回并且调用者不能以任何有意义的方式使用该值时结束其生命周期。请注意,在此特定示例中,您可能会打印出“正确”的值,但这只是巧合,在将 y 传递给 y 后取消引用是未定义的行为。

【讨论】:

  • 感谢您的澄清。语句“cout
  • @WilliamLee 对于小示例或作业来说很好,它不会在这里产生问题,请参阅here 了解为什么它通常被认为是不好的做法。但是,除了上面提到的原因,我根本看不到using namespace std; 的优势。
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多