1. 程式人生 > >void型別 C語言

void型別 C語言

void的字面意思是“無型別”,void *則為“無型別指標”,void *可以指向任何型別的資料。

定義一個void變數沒有意義,不妨試著定義:

void a;這行語句編譯時會出錯,提示“illegal use of type 'void'”。不過,即使void a的編譯不會出錯,它也沒有任何實際意義。void真正發揮的作用在於:(1) 對函式返回的限定;(2) 對函式引數的限定。眾所周知,如果指標p1和p2的型別相同,那麼我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的資料型別,則必須使用強制型別轉換運算子賦值運算子右邊的指標型別轉換為左邊指標的型別。例如:
123float * p1;
int * p2;p1 = p2;
其中p1 = p2語句會編譯出錯,提示“'=' :
1cannot convert from 'int*' to 'float*'
必須改為:
1p1 = (float) * p2;
而void *則不同,任何型別的指標都可以直接賦值給它,無需進行強制型別轉換
123void * p1;int * p2;p1 = p2;
這並不意味著,void *也可以無需強制型別轉換地賦給其它型別的指標。因為“無型別”可以包容“有型別”,而“有型別”則不能包容“無型別”。道理很簡單,我們可以說“男人和女人都是人”,但不能說“人是男人”或者“人是女人”。下面語句編譯出錯:
123void
 * p1;
int * p2;p2 = p1;
提示“'=' :
1cannot convert from 'void *' to 'int *' 。

其中 連結串列的封裝用到過 void 資料型別

typedef void SeqList; 給void起別名為 SeqList

typedef void SeqListNode;
這樣做是為了使用者方便閱讀,

SeqList* SeqList_Create(int capacity); //這樣一看返回值就知道是返回值是連結串列

void * SeqList_Create(int capacity); //如果這樣,使用者一看只知道是返回指標,不知道具體的,可讀性很差

所以才會給void起別名,封裝好的底層函式,提供給使用者使用,使用者會給容易懂