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