void关键字的使用规则:
1. 如果函数没有返回值,那么应声明为void类型
2. 如果函数无参数,那么应声明其参数为void
3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void *
4. void不能代表一个真实的变量
void真正发挥的作用在于:
- 对函数返回的限定
- 对函数参数的限定
规则一: 如果函数没有返回值,那么应声明为void类型
我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为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中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。
再如,交换两个变量:
void swap(void* lsh, void* rhs, size_t size) { ;// }
有了这样一个函数,那么如果想要交换两个变量,那就可以:
swap(&ai, &bi, sizeof(int)); swap(&af, &bf, sizeof(float));
小心使用void *
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型
float *p1; int *p2; p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1; int *p2; p1 = p2;
void*和其他指针一样,都是占同样大小的内存空间,唯一和其他指针不同的就在于你不能对void*进行解引用,看起来其他类型的指针都可以用void*来代替,只要在解引用之前把它转换为相应类型的指针就OK了!
不能对void指针进行算法操作,即下列操作都是不合法的:
void * pvoid; pvoid++; //ANSI:错误 pvoid += 1; //ANSI:错误
ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的。
规则四:void不能代表一个真实的变量
下面代码都企图让void代表一个真实的变量,因此都是错误的代码:
void a; //错误
function(void a); //错误