void与void *

void关键字的使用规则:算法

1. 若是函数没有返回值,那么应声明为void类型编程

2. 若是函数无参数,那么应声明其参数为void函数

3. 若是函数的参数能够是任意类型指针,那么应声明其参数为void * spa

4. void不能表明一个真实的变量指针

 

void真正发挥的做用在于:code

  • 对函数返回的限定
  • 对函数参数的限定

规则一: 若是函数没有返回值,那么应声明为void类型对象

咱们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。若是函数没有返回值,必定要声明为void类型。这既是程序良好可读性的须要,也是编程规范性的要求。另外,加上void类型声明后,也能够发挥代码的“自注释”做用。代码的“自注释”即代码能本身注释本身。blog

 

规则二:若是函数无参数,那么应声明其参数为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); //错误

相关文章
相关标签/搜索