C++ - Google 练习代码中指向局部变量的指针
C++ - Pointer to local variable in Google's exercise code
Here,在练习 #1 中,有一个函数 HardToFollow
:
void HardToFollow(int *p, int q, int *num) {
*p = q + *num;
*num = q;
num = p;
p = &q;
Unknown(num, *p);
}
倒数第二行使 p
指向 q
这是一个局部变量(参数的副本)。指向局部变量的指针。
稍后,在主函数中,作为第一个参数传递的指针在调用后使用。这不应该是未定义的行为吗?在调用 HardToFollow()
之后,作为第一个参数传递的指针不应该是未定义的吗?
编辑: 我知道这不是未定义的行为,指针本身可以更改而不反映传递参数的行为,只有指向值的更改才是永久的.
请记住,默认情况下所有参数都是按值传递的。这意味着传递的表达式的值被复制到函数局部参数变量中。这也意味着改变参数变量(比如给它赋值)只会改变局部参数变量本身,而不是调用函数时使用的原始值。
这就是这里发生的事情:有人调用传递指针的 HardToFollow
函数。该指针的值被复制到局部参数变量 p
中。对 p
本身的任何赋值将 仅 修改局部变量 p
.
所以不,这不会导致 UB,这是完全有效的。
Here,在练习 #1 中,有一个函数 HardToFollow
:
void HardToFollow(int *p, int q, int *num) {
*p = q + *num;
*num = q;
num = p;
p = &q;
Unknown(num, *p);
}
倒数第二行使 p
指向 q
这是一个局部变量(参数的副本)。指向局部变量的指针。
稍后,在主函数中,作为第一个参数传递的指针在调用后使用。这不应该是未定义的行为吗?在调用 HardToFollow()
之后,作为第一个参数传递的指针不应该是未定义的吗?
编辑: 我知道这不是未定义的行为,指针本身可以更改而不反映传递参数的行为,只有指向值的更改才是永久的.
请记住,默认情况下所有参数都是按值传递的。这意味着传递的表达式的值被复制到函数局部参数变量中。这也意味着改变参数变量(比如给它赋值)只会改变局部参数变量本身,而不是调用函数时使用的原始值。
这就是这里发生的事情:有人调用传递指针的 HardToFollow
函数。该指针的值被复制到局部参数变量 p
中。对 p
本身的任何赋值将 仅 修改局部变量 p
.
所以不,这不会导致 UB,这是完全有效的。