【C/C++】无类型指针(void *)

无类型指针(void *)与显式类型转化


void *(无类型)指针可以指向任意类型的数据,即可以用任意类型的指针对void指针赋值。例如:

int  *pint   ;
void *pvoid  ;      //它没有类型,或者说这个类型不能判断出指向对象的长度
pvoid = pint ;      //只获得变量/对象地址而不获得大小,即pvoid的指针类型还是没有转变
						//但是不允许 pint=pvoid;
printf("%d",*pint);		//正确
printf("%d",*pvoid);	//错误,pvoid不是指向某类型的指针
printf("%d",*(int *)pvoid);   //正确,同printf("%d",*pint);
				   
  1. 在C语言中,可以把任何类型的指针(包括函数指针)赋值给void*指针而无须进行强制类型转换。

    在C++中,对这个转换做了更严格的限制:只有非 常量指针才能赋值给void*指针。
    C++示例代码:

    const char pp[10] = {0};
    const char* str = "aaa";		//pp与str均为指向常量区的指针
    void* pv = NULL;
    pv = pp;//错误,不能将常量指针赋值给void *指针
    pv = str;//错误,不能将常量指针赋值给void *指针
    
    
  2. 如果要将pvoid赋给其他类型指针,则需要强制类型转换如:

    pint = (int *)pvoid;     //转换类型也就是获得指向变量/对象大小
    
  3. void指针在强制转换成具体类型前,不知道指向对象的(字节)大小,不能解引用(即取内容的意思)

    【Eg】 void *pvoid=pint;

    ​ *pvoid //错误;

  4. void指针不能参与指针运算,除非进行转换。

    只知道地址,不知道指针类型(大小),

    即:参与运算的指针必须是确定知道其指向数据类型大小的。

  5. void指针的应用

当进行纯粹的内存操作的时候,或者传递一个指向未定类型的指针时,可以使用void指针;
典型的如内存操作函数memcpy和memset的函数原型分别为:

void * memcpy(void *dest,constvoid * src,size_tlen);

void * memset(void * buffer,intc,size_tnum);

这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。
注意memcpy和memset函数返回的也是void*类型。

【注】:malloc函数的返回类型是void*

int p =(int)malloc(100sizeof(int));

进行了强制性转化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值