C ++指针 - 函数调用中的重新赋值

时间:2012-07-17 08:44:40

标签: c++ pointers

我最近正在审核Google的C++ materials并且遇到following code用于演示指针

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指针最初分配给麻烦[1]。当发送到HardToFollow时,q指针(现在称为p)更新为值4,并且随后也会更新故障[1]。紧接着,原始的q指针(在该函数中再次称为p)被重定向以指向局部变量(p =&amp; q)。然而,在程序结束时,我们的原始q指针又回到了指向麻烦[1]。这是怎么发生的?

3 个答案:

答案 0 :(得分:3)

您不能通过传递值将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 } 以指向其他内容。

略微修改示例应该按照您的预期执行:

{{1}}

答案 1 :(得分:1)

我已经添加了一些明确的评论:

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]);

答案 2 :(得分:0)

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

的指针的值