这是我的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;则编译器将不会显示警告.