void *总结

我们更常见的是void的两种使用,如下:
1)void 函数名( 参数 );
2)返回值 函数名( void );

第一种是在函数没有返回值时用void限定,第二种是函数不接受参数时用void限定,如果说void是“拒绝”,那么void *就是“接受”

一)void *是什么?

void *是一种无类型的指针,用来存放地址,在32位系统上占4字节空间,在64位系统上占8字节空间,void *的“无类型”让程序的编写有了极大的灵活性。

二)void *有什么作用?

void *的常见使用场景与void相似,但作用几乎完全相反:
1)void *函数名( 参数 );
例如内存分配函数malloc():

void * malloc(size_t size);

2)返回值 函数名( void * );
例如内存空间释放函数free():

void free(void *ptr);

第一种函数可以返回任意类型的指针而不需要强制类型转换,而第二种函数可以接收任意类型的指针而不需要强制类型转换
例如:

int a = 10;
int *q1 = &a;//int类型的指针存放int类型数据的地址
void *q2 = &a;//void类型的指针存放int类型数据的地址
char *q3 = (int *)&a;//char类型的指针存放int类型数据的地址需要强制类型转换

三)void *操作变量

void *是一种无类型的指针,它与int *char *等指针类型操作变量的方式不同例如:

int a = 10;
int *p_int = &a;
void *p_void = &a;

p_intp_void都是指向int类型的变量a的指针,现在分别用指针p_intp_void将a的值改为7,我们首先会想到这样做:

*p_int = 7;
*p_void = 7;

此时编译器就会报错:
warning: dereferencing ‘void *’ pointer [enabled by default]
error: invalid use of void expression
正确的做法是:

*p_int = 7;
*(int *)p_void = 7;

void *是无类型的指针,在对它赋值时它可以赋值为任意类型的指针而且不用强制类型转换,但是一旦要用它操作变量,就需要告诉它现在它的身份是什么类型的指针,不然它不知道几个字节,也就无法正确取值了,这就是编译器报错的原因,也是为什么要在操作变量时强制类型转换void *为其他类型的指针。

四)void *使用总结

  1. 用于接收或返回不同类型的指针
  2. 在参数个数不确定时可以使用void *类型来接收参数,需要传入多个参数时,将参数封装成结构体,传入结构体指针即可
  3. 在某些特殊情况下,可以传值,也就是用本来放地址的空间来放数据(编译会warning,但并不影响)
  4. 在使用void *指针操作变量时,要强制类型转换void *为其他类型的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值