void的字面意思是“无类型”,void *则为“无类型 指针 ”, void *可以指向任何类型的数据。
void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。
下面给出void关键字的使用规则:
规则一
如果函数没有返回值,那么应声明为void类型
规则二
如果函数无参数,那么应声明其参数为void。
规则三
小心使用void指针类型
规则四
如果函数的参数可以是任意类型指针,那么应声明其参数为void *
典型的如内存操作函数memcpy和memset的函数原型分别为: void * memcpy(void *dest, const void *src, size_t len); void * memset ( void * buffer, int c, size_t num ); 这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。如果memcpy和memset的参数类型不是void *,而是char *,那才叫真的奇怪了!
规则五
void不能代表一个真实的变量
(void *)是一个指针类型;空指针。
既然是指针,他们它就是一个地址,在内存中,地址就可以用 int 来表示;
参数传递中常常用到(void *)的,尤其多线程。
你可以把任何的结构体的地址转为(void *)类型来传递,用到的时候再把它转回来。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用 强制类型转换 运算符把赋值运算符右边的指针类型转换为左边指针的类型。
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。