void 和 void* 指針分別表示無類型和無類型指針。算法
void 的做用是限制:函數
1,函數無返回值。spa
2,函數無參數。指針
當函數的返還值無參數的時候必定要加上 void ,由於在缺省的狀態下函數的返還值是 int ,而且若是不須要的時候就必定要將他聲明成 void 類型這樣看着更明顯。當函數無參數的時候在聲明的時候也要加上 void 的這也是一個好習慣,加強了可讀性,固然在 K&R C 中是容許在聲明的時候省去參數的。
code
void 類型的和指針能夠接受任何類型的類型的指針的賦值(可是不表明這個void類型的指針轉化成相應的指針了,若是須要按照原指針的類型使用用,仍是須要進行強制類型轉換)。對象
#include<stdio.h> int main() { int a=1; int *b; b=&a; void *c; c=b; printf("%d\n",*(int *)c); }
在void指針存儲的是結構指針須要注意的是看以下代碼片斷:blog
if( (*(STRUCTNAME *)p).next == NULL ) { return FALSE; } else { free=(*(STRUCTNAME *)p).next; (*(STRUCTNAME *)p).next= ( *(STRUCTNAME *)( (*(STRUCTNAME *)p).next ) ).next; }
void *的做用編譯器
你能夠把 void * 指針看做是水果,水果有不少種類,能夠是蘋果,香蕉,可是不能說水果香蕉,由於還多是蘋果,可是你能夠說香蕉是水果。一樣的其餘類型的指針能夠直接賦值給 void * 指針,可是void* 指針就不能夠直接賦值給其餘類型指針,這裏就須要進行類型強制轉換,類型強制轉換能夠躲避過編譯器錯誤的檢測。因此在使用強制類型轉化的時候須要肯定這個轉換是正確的。
io
void * 指針是一種未知類型的指針,它在使用的時候不受限制,他能夠用來存儲任何類型的指針,這樣獲得的類型就能夠按照你的須要進行轉換。
編譯
由於 void * 指針其實能夠說是沒有類型,就是編譯器不知道指針所指向對象的長度。
void * 指針不能進行副引用,就是不能取得 void *指針的內容。
void * 指針在 ASNI 標準上不許許進行算法操做(如:void *a; int *b; a=b; *a=2; //錯誤) ASNI C 堅信進行算法操做必定要知道指向數據類型的大小,可是在 GNU 中就是能夠的。 GNU 支持了更多的語法,可是爲了可移植性,在編寫代碼的時候仍是要按照 ASNI C 的標準。