通过引用传递指针

Pass pointer by reference

在尝试 this HackerRank tutorial 时(您需要将 a 设置为 a+b 并将 b 设置为 |a-b|),我首先尝试修改指针以指向新值:

void update(int *a,int *b) {
    // Complete this function
    int sum = *a + *b;
    int diff = *a - *b;
    if (diff < 0) diff = -diff;
    a = &sum; //these do not work, because a and b are passed by value
    b = &diff;
}

这不起作用——回到 main 中,a 和 b 指向它们的原始值——因为(或者我理解)指针 a 和 b 按值传递给 update()。没问题,我想,我将更改函数签名以通过引用传递指针:

void update(int *&a,int *&b) {

遗憾的是,这也不起作用,但我不知道为什么。有人可以解释为什么这些指针似乎是通过引用传递的,却没有在函数范围之外更新吗?

您正在将局部变量(sum, diff 函数退出后超出范围的地址)分配给 ab。访问 main 中的那些地址是未定义的行为。 您可以改为分配它们的值。

*a = sum; 
*b = diff;

您似乎已经在模拟 通过引用传递整数变量,将它们作为指针传递。

我怀疑你真正应该做的是

*a = sum;
*b = diff;

然后在调用函数时使用寻址运算符&将指针传递给普通int变量:

int sum, diff;
update(&sum, &diff);

如果您传递对指针的引用并执行例如

a = &sum;

然后你会让a指向一个局部变量。一旦函数 returns,将(在某种程度上)不复存在的局部变量。这意味着指针将无效,取消引用将导致 undefined behavior.

并且除非您需要保持与 C 的兼容性,否则在 C++ 中仅使用实际引用而不是通过指针模拟:

void update(int& a,int& b) {
    ...
    a = sum;
    b = diff;
}

并称其为

int sum, diff;
update(sum, diff);