我最近正在审核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]。这是怎么发生的?
答案 0 :(得分:3)
您不能通过传递值将main::q
传递给HardToFollow
函数来简单地修改q
。由于您将HardToFollow
传递给它作为值传递,因此在q
中,您可以通过p
和p
本身修改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
的指针的值