C++ 通过引用传递指针

C++ 通过引用传递指针,c++,pointers,pass-by-reference,pass-by-value,C++,Pointers,Pass By Reference,Pass By Value,在尝试时(需要将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 passe

在尝试时(需要将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;
}

不幸的是,这也不起作用,但我不知道为什么。有人能解释一下为什么这些指针(看起来是通过引用传递的)没有在函数的作用域之外得到更新吗?

您正在为
a
b
分配局部变量的地址(
sum,diff
,一旦函数退出就会超出作用域)。在
main
中访问这些地址是未定义的行为。 您可以指定它们的值

*a = sum; 
*b = diff;

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

我怀疑你真正应该做的是

*a = sum;
*b = diff;
然后在调用函数时,使用运算符
的地址将指针传递到普通
int
变量:

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

如果您将引用传递给指针,并执行以下操作:

a = &sum;
然后将
a
指向一个局部变量。一个局部变量,一旦函数返回,它(在某种程度上)就不再存在。这意味着指针将无效,取消引用它将导致错误

除非你需要保持与C的兼容性,否则C++中只使用实际引用而不是通过指针仿真:

void update(int& a,int& b) {
    ...
    a = sum;
    b = diff;
}
就这样说吧

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

我知道这是我应该做的。我试图通过学习为什么问题中的方法不起作用来更好地理解引用语义。那么既然它是UB,HackerRank使用的任何编译器都会将变量设置回它们以前的值?我没料到。我们无法可靠地预测未定义的行为会发生什么。一切皆有可能。“对程序的行为没有限制”是真的。我只是没想到编译器会保留旧值。@molbdnilo:在函数退出后使用超出范围的局部变量的地址并在main中取消引用它们,这不是未定义的行为吗?
int sum, diff;
update(sum, diff);