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 的指针,并检索该地址处的值。如果iint,则它等价于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语言的规定?

将带有数字和字母的字符串放入结构中的int指针中

如何阅读uniform_int_distribution概率质量函数?

为什么这个指向指针二维数组的指针会像这样分配新的int

编写函数可以对任意个整型元素 的数组排序,用指针实现函数原型为sort(int*p,intn),其

不能将int类型的值分配到int类型的实体,是啥意思?例如int *a[10];a[0]=j-i;(i、j均为指针)。