在最近的一次微软采访中提出了以下问题。
这两个声明有什么区别?
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,然后你就可以对这两个中的任何一个进行所有这些转换。