void与void *

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); //错误

posted on 2016-05-27 14:23  已停更  阅读(1001)  评论(0编辑  收藏  举报