如何无效* a =&合法?
考虑下面的C ++代码:
void* a = &a;
为什么编译器不抱怨使用未声明的标识符?
另外,编译器认为variablesa
是什么? 它是一个指向无效对象的指针,还是指向void*
指针的指针?
在C ++中声明variables的范围可能是非常令人惊讶的:
void* a = &a; ^~~~~~~~~~~~~~~~~ a declared as `void*` from here on
因此, &a
是void**
但由于任何指针types都可以隐式转换为void*
…
这相当于
void* a; a = &a;
因此,已经宣布了一个。 所以得到a
写在a
地址。 所以它是一个指向void指针的指针。 (你还没有定义任何对象。)
在void* a
, a
被声明为不是void
types的指针,而是“any”types的指针(特例)。 一个地址(在内存中的位置)被分配给a
,当然还有其他正在声明的variables。
之后,expression式&a
被评估为初始化刚才声明的variables(也是a
,但这不相关)。 &a
的types是“指向任何types的指针的指针”,这是“指向任何types的指针”的特例,与a的types完全兼容。 人类,没有编译器的消息。
推论:如果你想强types检查,不要使用void*
。 任何东西都可以转换成它。 正好相反,除了void*
本身(这将是一个不必要的例外,一个types与自身不兼容)。
另外,AFAIR这真的来自C.
void
指针指向任何地址都可以。 问题是,当你解除引用。 您必须将其转换为您希望此指针指向的types。