int p = *(int *)i和int p = *(int *)&i之间的区别
最近一次微软访谈中提出了以下问题。int p = *(int *)i和int p = *(int *)&i之间的区别
这两个声明有什么区别?
int p=*(int*)i;
int p=*(int*)&i;
我认为在第一个i
是一个指针,并在第二个i
是一个变量。
还有别的吗?
第一个是将i
中的值作为指针处理,然后检索值是否在该地址(如果可能)。
第二个地址为i
,将其转换为指向int的指针,并检索该地址处的值。如果i
是int
,则相当于p=i;
。如果不是,则将采用从i
开始的第一个CHAR_BIT *sizeof(int)
位,并且(试图)将它们视为int
,并将创建的任何值分配给p
。
编辑:是的,作为@R。 Martinho Fernandes指出,如果i
有一个超载的operator &
,它可能会做一些与上述任何事情相当不同的事情(即,而不是i
的地址,它将从operator &
返回的任何地址开始)。
除非'i'的类型是邪恶的,即,有一个重载的'操作符&'! :P – 2012-07-05 18:18:05
当然,形式上,如果'i'不是'int',则第二个结果是未定义的行为。如果'i'的对齐要求不如'int',那么它可能会崩溃,并且如果'i'小于'int',它可能会崩溃,而恰好在映射内存的最后。 – 2012-07-05 18:22:44
如果你知道的语言,然后这个问题归结为是什么betweeen
i
和
&i
的差异,答案是,在第一种情况下它是i
和第二它的地址为i
,然后你就可以将这些转换转换为这两者中的任何一个。
任何足够先进的差异程序会告诉你这是第14列的&符号。 – 2012-07-05 18:13:43
“我”是如何申报的?如果它是一个'int',那么'&i'已经是'int *'类型了,而第二行的强制转换是多余的。 – 2012-07-05 18:15:46
它的种类取决于我的类型。 – Kevin 2012-07-05 18:16:01