关键字 void是在C90新增加的。它的用法涉及几个方面:
在函数原型中,函数原型为编译器提供依据检查函数的参数是否合乎要求。但由于大量的k&R c 中,是这样声明函数的: double fun ();
C90中,为了能够确切的检测函数参数,明确指出应该使用 double fun(void);
但又考虑到对以前版本的兼容,所以在,C90的版本中,遇到double fun ();会自动避免函数参数的检测,所以有时我们这样写是可以的。但是我们就不能使用编译器去进行函数参数合法检测。
实际意思就是 当你写 double fun()时,可以编译通过,那你写fun(50),可能也会通过编译,而不会得到报错。
通用指针 void *
同时 C90还增加了 void * ;void *指向的对象不确定,可能是int ,struct; 总之 void 指针可以指向任何对象(除了函数)。
void 指针具有以下特征:
#1 它可以与其他任何指针相互转化,而不需要强制转化。
int * p;
void *ptr;
p = ptr;
ptr = p; 都是可以的。
#2不能对它进行取值或者下标操作。(解释是,因为他没有具体的类型,)
void *的作用:
在C90以前的版本中,"通用指针"应该算是char *;因为一个char 占一个字节,这个和存储器以字节为最小单位的概念相吻合。但是char * 和其他的指针相互赋值时 需要强制类型转化,这在具体操作时是很麻烦的。
例如要比较连个struct * 对象的内容:
以前没有void * 是strcmp(char* str ,char * ste ,size_t n);使用时就必须强制类型转化
strcmp((char *)ps1 , (char *) ps2, sizeof(struct s));
而如果有void* 时 ,我们可以strcmp(const void * ps1 ,const void * ps2 ,size_t n);
然后调用时 是 strcmp (ps1, ps2,sizeof(struct s));
还有一个很好的例子是malloc 函数,以前写的是int *pi=(int *)malloc(sizeof(int));因为malloc返回的是一个char *类型。
而在C90的函数库中:
void * malloc(size_t size);
有了void* 我们就可以直接写成 :int *pi=malloc(sizeof(int));
当然,在C++中,还是要求有类型的转化,必须明确操作,这个不讨论。
在多说一点关于void*
NULL这个空指针,也是一个void* ;
C语言是这样定义NULL:
#define NULL(void *)0
今天暂时写到这里。顺道说句我自己对C语言的看法, 个人一个觉得预处理和指针是C语言的精华。尤其对一个嵌入式程序开发者而言。