int p = *(int *)i 和 int p = *(int *)&i 之间的区别
Posted
技术标签:
【中文标题】int p = *(int *)i 和 int p = *(int *)&i 之间的区别【英文标题】:Difference between int p = *(int *)i and int p = *(int *)&i 【发布时间】:2012-07-05 18:11:33 【问题描述】:在最近的一次微软采访中提出了以下问题。
这两种声明有什么区别?
int p=*(int*)i;
int p=*(int*)&i;
我认为第一个 i
是一个指针,第二个 i
是一个变量。
还有什么吗?
【问题讨论】:
任何足够高级的 diff 程序都会告诉你它是第 14 列的 & 符号。i
是如何声明的?如果是int
,那么&i
已经是int*
类型,第二行中的转换是多余的。
这取决于 i 的类型。
如果不知道i
是什么,这个问题几乎毫无意义。如前所述,它只有一个答案:马蒂尼奥在上面的评论中给你的答案。
【参考方案1】:
第一个是获取i
中包含的值,将其视为指针,然后检索该地址处的任何int
值(如果可能)。
第二个获取i
的地址,将其转换为指向 int 的指针,并检索该地址处的值。如果i
是int
,则它等价于p=i;
。如果不是,它将获取从i
地址开始的第一个CHAR_BIT *sizeof(int)
位,并(尝试)将它们视为int
,并将创建的任何值分配给p
。
编辑:是的,作为@R。 Martinho Fernandes 指出,如果i
有一个重载的operator &
,它可能会做一些与上述任何一个完全不同的事情(即,而不是i
的地址,它将以其operator &
返回的任何内容开头) .
【讨论】:
除非i
的类型是邪恶的,即有一个重载的operator&
! :P
当然,形式上,如果i
不是int
,则第二个会导致未定义的行为。如果i
的对齐要求没有int
严格,它可能会崩溃,如果i
小于int
,它可能会崩溃,并且恰好位于映射内存的最后。【参考方案2】:
如果你懂语言,那么这个问题归结为两者之间的区别
i
和
&i
答案是,在第一种情况下它是i
,在第二种情况下它是i
的地址,然后你就可以对这两个中的任何一个进行所有这些转换。
【讨论】:
以上是关于int p = *(int *)i 和 int p = *(int *)&i 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
int a[3] = 1,2,3; int*p, *q; p = a; q = &a[2]; int i = q-p;为何i的结果为1而不是8,C语言的规定?
如何阅读uniform_int_distribution概率质量函数?