我们更常见的是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_int
和p_void
都是指向int
类型的变量a
的指针,现在分别用指针p_int
和p_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 *使用总结
- 用于接收或返回不同类型的指针
- 在参数个数不确定时可以使用void *类型来接收参数,需要传入多个参数时,将参数封装成结构体,传入结构体指针即可
- 在某些特殊情况下,可以传值,也就是用本来放地址的空间来放数据(编译会warning,但并不影响)
- 在使用
void *
指针操作变量时,要强制类型转换void *
为其他类型的指针