在尝试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 = ∑ //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) {
可悲的是,这也不起作用,但是我不知道为什么。有人可以解释为什么这些似乎通过引用传递的指针没有在函数范围之外得到更新吗?
答案 0 :(得分:3)
似乎您已经通过引用将整数变量作为指针通过引用仿真进行了传递。
我怀疑您真正应该做的是
*a = sum;
*b = diff;
然后,在调用函数时,请使用地址运算符&
将指针传递给普通int
变量:
int sum, diff;
update(&sum, &diff);
如果您要传递指向指针的引用并执行例如
a = ∑
然后,您将使a
指向局部变量。函数返回后,局部变量将(以某种方式)停止存在。这意味着指针将无效,对其取消引用将导致undefined behavior。
除非您需要保持与C的兼容性,否则在C ++中,仅使用实际引用而不是通过指针进行仿真:
void update(int& a,int& b) {
...
a = sum;
b = diff;
}
并称呼它
int sum, diff;
update(sum, diff);
答案 1 :(得分:2)
您正在为sum, diff
和a
分配局部变量的地址(b
,一旦函数退出,它们将超出范围)。访问main
中的那些地址是未定义的行为。
您可以改为分配它们的值。
*a = sum;
*b = diff;