考虑以下C ++代码:
void* a = &a;
为什么编译器不抱怨使用未声明的标识符?
此外,编译器认为变量a
是什么?它是指向void对象的指针还是指向void*
指针的指针?
答案 0 :(得分:95)
C ++中变量声明的范围可能非常令人惊讶:
void* a = &a;
^~~~~~~~~~~~~~~~~
a declared as `void*` from here on
因此,&a
是void**
,但由于任何指针类型都可以隐式转换为void*
...
答案 1 :(得分:30)
相当于
void* a;
a = &a;
因此,a
已被宣布。因此,a
会获得a
中写的a
地址。所以它是一个指向void指针的指针。 (你还没有定义任何对象。)
答案 2 :(得分:7)
在void* a
中,a
被声明为不是void
类型的指针,而是“任何”类型(特殊情况)。当然,地址(内存中的位置)被分配给a
,与被声明的任何其他变量一样。
之后,计算表达式&a
以初始化刚刚声明的变量(也是a
,但这不相关)。 &a
的类型是“指向任何类型指针的指针”,这是“指向任何类型的指针”的特殊情况,与a
的类型完全兼容。 Ergo,没有编译器消息。
推论:如果您想进行强类型检查,请不要使用void*
。 任何都可以转换为它。反方向正好相反,除了void*
本身(类型与自身不兼容是不必要的例外)。
此外,AFAIR这真的来自C。
答案 3 :(得分:-1)
指向任何地址的void
指针都没问题。问题是你取消引用它。您必须将其强制转换为您希望此指针指向的类型。