通常情况下,指针变量可以通过(void *)Pointervariable
被类型化为空指针,但是我看到一个程序,其中int
变量的正常变量用作(void *)variable
,同样int
}变量也用作(void *) &variable
。
这两个是什么意思?
答案 0 :(得分:3)
那是将整数值视为一个指针(期望访问该整数值指出的内存),没有别的
然而,这不是一个很好的做法。引用C11
,章节§6.3.2.3
整数可以转换为任何指针类型。除非事先指明,否则 结果是实现定义的,可能没有正确对齐,可能不指向 引用类型的实体,可能是陷阱表示。
对于更安全的整数到指针(反之亦然)转换,有两种类型明确定义,intptr_t
和uintptr_t
。从章节§7.20.1.4
以下类型指定带有任何有效属性的有符号整数类型 指向void的指针可以转换为这种类型,然后转换回指向void的指针, 并且结果将与原始指针进行比较:
intptr_t
它是未签名的对应人uintptr_t
。
该标准将这些类型设为可选,因此,再次无法保证所有实施的可用性。
但是,关于(void *) &variable
,将指向某个类型的指针视为指向void
的指针。如果指针稍后在解除引用之前转换为原始类型,则这有时会很有用。这是完美定义的行为。再次引用标准(强调我的)
指向对象类型的指针可能会转换为指向不同对象类型的指针。如果 结果指针未正确对齐引用类型,行为是 未定义。 否则,当再次转换回来时,结果应该等于 原始指针。