对void用法和注意事项进行总结,以及提出几个问题:

  • void*进行赋值后,可以直接使用memcpy么

  • void*并不知道空间大小,放在结构体中如何确定结构体的空间

含义

void即“无类型”,void *则为“无类型指针”,能够指向不论什么数据类型。

void指针总结

指针有两个属性:指向变量/对象的地址和长度

但是指针只存储地址,长度则取决于指针的类型

首先我们要了解指针是什么,指针只存储地址的值,长度取决于指针的类型,也就是说指针的运算才和类型有关,因此可以进行memcpy只是需要定义一下指针的类型。也就解决了第二个问题,void*存储的是变量/对象地址,地址是一个4位或者8位的变量,根据系统位数而定,因此结构体的空间也就是固定的。

任何指针都可以赋值给void指针

void指针能够指向随意类型的数据,亦就可以用随意数据类型的指针对void指针赋值。其中可以不进行转换,只需要获取变量、对象的地址而不获取大小。第一个问题也就解决了,void*指针是可以直接memcpy的,但是如果要进行指针运算,就需要转换,具体原因看下面。

void指针赋值给其他类型的指针时都要进行转换

void指针不能参与指针运算,除非进行转换

但是值得注意的是,void指针赋值给其他类型的指针都要进行转换,因为指针不仅要知道指向变量/对象的地址,还需要知道指向对象的长度。也因此参与指针运算,同样需要类型转换。

在ANSIC标准中,不同意对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则同意,由于在缺省情况下,GNU觉得void 与char *一样。sizeof(pvoid )== sizeof( char)。不同的标准对指针运算的标准不一样,但是严格起见,我们都应该对指针类型进行赋值才能开始运算。

在函数的返回值中, void 是没有任何返回值, 而 void * 是返回任意类型的值的指针.

注意函数的返回值是void*的时候是返回任意类型的值。

void*指针的作用

由于void指针能够指向随意类型的数据,亦就可以用随意数据类型的指针对void指针赋值,因此还能够用void指针来作为函数形參,这样函数就能够接受随意数据类型的指针作为參数。比如:

void * memcpy( void *dest, const void *src, size_t len ); 
void * memset( void * buffer, int c, size_t num);

相比于void发挥的作用在于:

  • 对函数返回的限定;
  • 对函数參数的限定。