void与void 指针深度理解

来源:互联网 发布:天普大学 知乎 编辑:程序博客网 时间:2024/05/21 06:52

1.void与void指针

  void 是“无类型”;void * 是“无类型指针”,是可以指向任何数据类型的指针,当然必须理解什么是指针。

2.void的使用

①对函数返回值进行限制,函数不需要返回值时,void修饰。如,void funcName(int numA,int numB);

如果函数返回值处什么也没写,如funcName(int a,int b),此时默认返回值为整型,而不是void,此处易错。

引申:编程规范,返回值类型要严格指定,空写void,不然写上对应类型,这是好的编程习惯。

②对函数参数列表进行限制,函数不允许接收参数时,必须用void修饰。如,int funcName(void);

3.void *的使用

①void指针可以指向任何数据类型指针;任何数据类型指针都可给void指针赋值,但void指针类型不能赋给具体类型指针。两者之间的关系就像是Java中父类与子类的关系,子类对象可赋值给父类变量,但是父类对象不能赋值给子类变量。再如,可以把苹果叫水果,但不能把水果叫苹果。

int *pInt;void *pVoid;pVoid=pInt;pInt=pVoid;//此处编译报错
当然,上述问题可以通过强制类型转换来解决,pInt=(int *)pVoid。

②由于void指针既可指向任何数据类型,任何数据类型都可赋值给void指针,故可用void *指针类型作为形参,这样此函数可以接收任何类型参数。

:void *memset(void *s, char ch, size_t n);
在ANSIC标准中,不允许对void指针进行算术运算如pVoid++或pVoid+=1等,ANSI标准之所以这样认定,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的;但GNU中允许,因为在缺省情况下,GNU认为void *与char *一样sizeof(*pVoid )== sizeof( char)。虽然GNU语法更开放,但是编程时还是要按ANSI的标准来。

写到这儿,欢迎大家留言讨论。