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