void和void*指针的一些理解
void 和 void* 指针分别表示无类型和无类型指针。
void 的作用是限制:
1,函数无返回值。
2,函数无参数。
当函数的返还值无参数的时候一定要加上 void ,因为在缺省的状态下函数的返还值是 int ,并且如果不需要的时候就一定要将他声明成 void 类型这样看着更明显。当函数无参数的时候在声明的时候也要加上 void 的这也是一个好习惯,增强了可读性,当然在 K&R C 中是允许在声明的时候省去参数的。
void 类型的和指针可以接受任何类型的类型的指针的赋值(但是不代表这个void类型的指针转化成相应的指针了,如果需要按照原指针的类型使用用,还是需要进行强制类型转换)。
#include<stdio.h> int main() { int a=1; int *b; b=&a; void *c; c=b; printf("%d\n",*(int *)c); }
在void指针存储的是结构指针需要注意的是看如下代码片段:
if( (*(STRUCTNAME *)p).next == NULL ) { return FALSE; } else { free=(*(STRUCTNAME *)p).next; (*(STRUCTNAME *)p).next= ( *(STRUCTNAME *)( (*(STRUCTNAME *)p).next ) ).next; }
void *的作用
你可以把 void * 指针看作是水果,水果有很多种类,可以是苹果,香蕉,但是不能说水果香蕉,因为还可能是苹果,但是你可以说香蕉是水果。同样的其他类型的指针可以直接赋值给 void * 指针,但是void* 指针就不可以直接赋值给其他类型指针,这里就需要进行类型强制转换,类型强制转换可以躲避过编译器错误的检测。所以在使用强制类型转化的时候需要确定这个转换是正确的。
void * 指针是一种未知类型的指针,它在使用的时候不受限制,他可以用来存储任何类型的指针,这样得到的类型就可以按照你的需要进行转换。
因为 void * 指针其实可以说是没有类型,就是编译器不知道指针所指向对象的长度。
void * 指针不能进行副引用,就是不能取得 void *指针的内容。
void * 指针在 ASNI 标准上不准许进行算法操作(如:void *a; int *b; a=b; *a=2; //错误) ASNI C 坚信进行算法操作一定要知道指向数据类型的大小,但是在 GNU 中就是可以的。 GNU 支持了更多的语法,但是为了可移植性,在编写代码的时候还是要按照 ASNI C 的标准。