2012-07-05 238 views
1

最近一次微软访谈中提出了以下问题。int p = *(int *)i和int p = *(int *)&i之间的区别

这两个声明有什么区别?

int p=*(int*)i; 
int p=*(int*)&i; 

我认为在第一个i是一个指针,并在第二个i是一个变量。
还有别的吗?

+13

任何足够先进的差异程序会告诉你这是第14列的&符号。 – 2012-07-05 18:13:43

+1

“我”是如何申报的?如果它是一个'int',那么'&i'已经是'int *'类型了,而第二行的强制转换是多余的。 – 2012-07-05 18:15:46

+3

它的种类取决于我的类型。 – Kevin 2012-07-05 18:16:01

回答

9

第一个是将i中的值作为指针处理,然后检索值是否在该地址(如果可能)。

第二个地址为i,将其转换为指向int的指针,并检索该地址处的值。如果iint,则相当于p=i;。如果不是,则将采用从i开始的第一个CHAR_BIT *sizeof(int)位,并且(试图)将它们视为int,并将创建的任何值分配给p

编辑:是的,作为@R。 Martinho Fernandes指出,如果i有一个超载的operator &,它可能会做一些与上述任何事情相当不同的事情(即,而不是i的地址,它将从operator &返回的任何地址开始)。

+2

除非'i'的类型是邪恶的,即,有一个重载的'操作符&'! :P – 2012-07-05 18:18:05

+1

当然,形式上,如果'i'不是'int',则第二个结果是未定义的行为。如果'i'的对齐要求不如'int',那么它可能会崩溃,并且如果'i'小于'int',它可能会崩溃,而恰好在映射内存的最后。 – 2012-07-05 18:22:44

0

如果你知道的语言,然后这个问题归结为是什么betweeen

i 

&i 

的差异,答案是,在第一种情况下它是i和第二它的地址为i,然后你就可以将这些转换转换为这两者中的任何一个。

相关问题