C90爲C語言增加了void : void 表示什麼?

關鍵字  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語言的精華。尤其對一個嵌入式程序開發者而言。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章