int p =*(int*)i和int p =*(int*)&i之间的区别

aka*_*ash 1 c c++ pointers casting

在最近的微软访谈中提出了以下问题.

这两个声明有什么区别?

int p=*(int*)i; 
int p=*(int*)&i; 
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 9

第一个是获取包含的值i,将其视为指针,并检索int该地址的任何值(如果可能).

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

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

  • 除非`i`的类型是邪恶的,即,有一个重载的`运算符&`!:P (2认同)