在最近的一次微软采访中提出了以下问题。
这两个声明有什么区别?
int p=*(int*)i;
int p=*(int*)&i;
我认为第一个i
是指针,第二个i
是变量。
还有别的事吗?
第一个是获取 中包含的值i
,将其视为指针,并检索int
该地址处的任何值(如果可能)。
第二个获取 的地址i
,将其转换为指向 int 的指针,并检索该地址处的值。如果i
是int
,则相当于p=i;
。如果不是,它将获取CHAR_BIT *sizeof(int)
从 的地址开始的第一位i
,并(尝试)将它们视为int
,并将创建的任何值分配给p
。
编辑:是的,作为@R。Martinho Fernandes 指出,如果i
有一个重载的operator &
,它可能会做一些与上述任何一个完全不同的事情(即,而不是它的地址将以其返回i
的任何内容开头)。operator &
如果您知道该语言,那么这个问题可以归结为两者之间的区别是什么
i
和
&i
答案是,在第一种情况下它是i
,在第二种情况下它是地址i
,然后你就可以对这两个中的任何一个进行所有这些转换。