C++ 指针 - 函数调用中的重新分配



我最近在查看Google的C++材料,并遇到了以下用于演示指针的代码

void Unknown(int *p, int num);
void HardToFollow(int *p, int q, int *num);
void Unknown(int *p, int num) {
 int *q;
 q = #
 *p = *q + 2;
 num = 7;
}
void HardToFollow(int *p, int q, int *num) {
 *p = q + *num;
 *num = q;
 num = p;
 p = &q;
 Unknown(num, *p);
}
main() {
 int *q;
 int trouble[3];
 trouble[0] = 1;
 q = &trouble[1];
 *q = 2;
 trouble[2] = 3;
 HardToFollow(q, trouble[0], &trouble[2]);
 Unknown(&trouble[0], *q);
 cout << *q << " " << trouble[0] << " " << trouble[2];
}

我的问题如下:q 指针最初被分配给 trouble[1]。当发送到 HardToFollow 时,q 指针(现在称为 p(会更新为值 4,麻烦 [1] 也会随之更新。紧接着,原始 q 指针(在此函数中再次称为 p(被重定向到指向局部变量 (p = &q(。尽管如此,在程序结束时,我们原来的 q 指针又回到了指向麻烦[1]。这是怎么发生的?

您不能简单地通过按值传递main::q将其传递给函数来修改HardToFollow。 由于您的q作为按值传递传递给它,因此在HardToFollow中,您可以修改q通过pp本身所指向的内容,但您无法修改q指向其他内容。

稍微修改示例将执行您所期望的操作:

void HardToFollow(int*& p, int q, int *num) {
 *p = q + *num;
 *num = q;
 num = p;
 p = &q;
 //Unknown(num, *p); //forget about this for now
}

我添加了一些评论,清楚地表明:

void HardToFollow(int *p, int q, int *num) {
  /* this modifies the value pointed to by p */
  *p = q + *num;
  *num = q;
  num = p;
  /* this does not modify the original pointer */
  p = &q;
  Unknown(num, *p);
}

[...]

  /* the memory address q points to is copied to the function scope */
  HardToFollow(q, trouble[0], &trouble[2]);

因为在函数 未知 中不使用主函数
中的指针 q该函数仅适用于名为 num 的指针的值

最新更新