如何无效* 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被声明为不是voidtypes的指针,而是“any”types的指针(特例)。 一个地址(在内存中的位置)被分配给a ,当然还有其他正在声明的variables。 
 之后,expression式&a被评估为初始化刚才声明的variables(也是a ,但这不相关)。  &a的types是“指向任何types的指针的指针”,这是“指向任何types的指针”的特例,与a的types完全兼容。 人类,没有编译器的消息。 
 推论:如果你想强types检查,不要使用void* 。  任何东西都可以转换成它。 正好相反,除了void*本身(这将是一个不必要的例外,一个types与自身不兼容)。 
另外,AFAIR这真的来自C.
  void指针指向任何地址都可以。 问题是,当你解除引用。 您必须将其转换为您希望此指针指向的types。