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