如何无效* a =& a legal?

时间:2013-08-14 06:36:01

标签: c++

考虑以下C ++代码:

void* a = &a;

为什么编译器不抱怨使用未声明的标识符?

此外,编译器认为变量a是什么?它是指向void对象的指针还是指向void*指针的指针?

4 个答案:

答案 0 :(得分:95)

C ++中变量声明的范围可能非常令人惊讶:

void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on

因此,&avoid**,但由于任何指针类型都可以隐式转换为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指针都没问题。问题是你取消引用它。您必须将其强制转换为您希望此指针指向的类型。