C/C++中的 void*

在看《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*)

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值