C90为C语言增加了void : void 表示什么?

来源:互联网 发布:第二行java 豆瓣 编辑:程序博客网 时间:2024/05/21 19:40

关键字  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语言的精华。尤其对一个嵌入式程序开发者而言。


0 0