为什么(void**)类型可以赋值给(void*)或(int*)?

kev*_*vin 11 c pointers

这是我的C代码:

int main()
{
    void * ptr_void;
    void ** ptr_2void;
    ptr_void = ptr_2void;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么这段代码有效?我已经分配了一个(void *)to (void **),编译器甚至在没有警告的情况下传递它.这种类型看起来不匹配.和下面的代码指派(void **)(int *)也有效.

int main()
{
    int * ptr_int;
    void ** ptr_2void;
    ptr_int = ptr_2void;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

任何人都能弄清楚究竟是什么(void *)东西?

Dee*_*epu 11

void指针的类型转换为隐式指向任何其他数据类型的指针.编译器不会显示任何警告.类似地,从任何类型的指针转​​换为void *也可以在没有警告的情况下工作.

除了void指针之外,如果您尝试隐式地从一种指针类型转换为另一种指针类型,则编译器将发出警告.

例如,考虑下面给出的代码,它会给你警告" assignment from incompatible pointer type".

  int *intptr;
  void *voidptr;
  void **vvptr;
  int intval=123;
  voidptr=&intval;
  vvptr=voidptr;
  intptr=vvptr; 
Run Code Online (Sandbox Code Playgroud)

导致警告的代码行是intptr=vvptr;因为intptr是一个integer pointer并且vvptr是类型的指针void **.它们都不是void *指针,因而是一个警告.

为了避免此警告,您必须显式地键入强制转换void **int *键入的类型.如果将行更改为intptr=vvptr; ,intptr=(int *)vvptr;则编译器将不会显示警告.

  • 我认为你混淆了演员和转换.最后一句话是完全错误的(对于我见过的所有编译器而言). (4认同)