C和C++关于void *使用的不同

一、文章结论:

C语言中任何类型的指针都可以(隐式地)转换为void*型,反过来也行;而C++中void*型不能隐式地转换为别的类型指针(例如:int*p = (void*)0;使用C++编译器编译会报错)


二、测试

/* 使用gcc编译器 */
#include <stdio.h>
#include <stdlib.h>  //为malloc() 和 free()提供原型;

int main(){
    double * ptd;
    ptd = malloc (30* sizeof(double));  //此处没有强制类型转化
    ptd[0] = 1.1;
    printf("%f",ptd[0]);
    free(ptd);
    return 0;
}

使用gcc编译器,输出为:

1.100000


但是如果使用g++编译器,会报错:

error: invalid conversion from 'void*' to 'double*' [-fpermissive]|


之所以会这样,因为C++是强类型的语言。void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 即任何类型的指针都可以直接赋值给它,无需进行强制类型转换。

但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人(int *)和女人(float *)都是人(void *)”,但不能说“人是男人”或者“人是女人”。


对于上面例子中的malloc函数,其返回值类型为void *,所以在申请内存之后给ptd赋值时,建议是进行强制类型转换的,虽然在C中不进行强制类型转换并不是错误(例如就上面的例子来讲,不进行强制类型转换也不报错),但是却是不好的编程风格[1]。但是在C++语言中,必须要进行强制类型转换(例如,int*p = (void*)0; 使用C++编译器编译会报错)[2],否则的话编译器会报错。所在C中也建议进行强制类型转换,这样更容易把C程序转化为C++程序。











[1] 嵌入式系统高级C语言编程 凌明 P7

[2] C Primer Plus 第六版中文版  P399

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值