【发布时间】:2017-01-22 22:58:49
【问题描述】:
问题描述
我在下面的例子中写了*x_ptr = *(y_ptr)&val; 我不明白为什么输出是10。记忆中发生了什么?我无法理解这种组合。
// Example program
#include <iostream>
#include <string>
int main()
{
int *x_ptr, *y_ptr;
int val = 10;
y_ptr = &val;
*x_ptr = *(y_ptr)&val;
std::cout << *x_ptr << std::endl;
}
假设我把*x_ptr = *(y_ptr)&val改成x_ptr = *(y_ptr)&val编译器会报如下错误为什么?
10:20: error: invalid conversion from 'int' to 'int*' [-fpermissive]
【问题讨论】:
-
这是未定义的行为:取消引用未初始化的
x_ptr。 -
&是二元与运算符。 -
哦,天哪,我看到了混乱。它被解释为
(*(y_ptr))&(val),但如果y_ptr是一个类型而不是一个变量,它也可以理解为*((y_ptr)(&val)) -
对不起@Mark Ransom。你去吧。我真的很想了解您在评论中的意思。我淹没在自己的愚蠢中。你能举个例子吗:但是如果 y_ptr 是一个类型而不是一个变量,那么它也是有意义的 *((y_ptr)(&val))
-
& 符号
&有两个 含义,它可以是逐位的and,也可以将变量的地址作为指针。括号()也有两种含义,它们可以表示运算符分组,也可以表示C 风格的类型转换。上下文决定使用哪种含义。
标签: c++ pointers memory-address dereference