对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发挥的作用在于:
- 对函数返回的限定;
- 对函数參数的限定。