在看《Unix/Linux系统编程》中关于POSIX Thread部分的时候发现C语言中用void*传递了int类型变量,很疑惑,于是查了些资料并汇总了一下。
介绍了C语言和C++中关于void*的用法,涉及到了C++中的reinterpret_cast
如果哪里有错误欢迎指正!
参考资料
1. C/C++中的void*与其他指针类型转换
1.1 C中void*与其他指针类型转换
C语言对指针类型的转换要求很低。但是这将留下一个很大的漏洞
int* a=NULL;
void* b=NULL;
char* c=NULL;
c=a; //warning C4133: “=”: 从“int *”到“char *”的类型不兼容,但是编译能通过
b=a; //将void*和其他类型的指针相互赋值不会出现警告,这在C语言中是允许的
c=b;
如果非void类型相互转换,需要显式的强制类型转换*
int* a=NULL;
char* c=NULL;
c=(char*)a;//将int*强制转换为char*类型
1.2 C++中void*与其他指针类型转换
C++中对类型要求很高,不允许不同类型指针之间的相互赋值,void指针例外(任何类型指针都可以赋值给void指针,但反之则不行)
int* a=Null;
void* b=Null;
char* c=Null;
c=a;//出错
b=a;//通过
c=b;//出错
如果要赋值必须显式强制类型转换(除了其他指针类型转换为void*类型)
C++中不建议用C风格的强制类型转换(type),而建议使用static_cast
等c++强制类型转换符。针对这里出现的问题,static_cast
可以将void*转换为其他指针类型,但是static_cast不能将两个毫无关联(如没有继承关系)的指针类型进行转换(如int*转换为char*)。