void 是 C 語言中獨特的關鍵字,字面含義「無類型」。它不代表一種具體類型,而是一種類型修飾語,用於三大核心場景。本文系統梳理 void、void*、函數返回/參數 void 的語法規則與實戰慣例。
void vs void*void:不完整類型,不可聲明變量,sizeof(void) 非法void*:無類型指針,可指向任意類型數據,佔用指針大小(32位 4B、64位 8B)內存操作函數統一使用 void* 接受任意類型緩衝區:
void *memcpy(void *dest, const void *src, size_t len); void *memset(void *buffer, int c, size_t num);
調用時隱式轉換:memcpy(&dst, &src, sizeof(src)),&dst 類型自動轉為 void*。
| 場景 | 語法 | 含義 |
|---|---|---|
| 無返回值 | void func(); | 函數不返回任何值,調用者不可用返回值 |
| 無參數 | int func(void); | 明確聲明不接受任何參數(C++ 中 int func() 同義,C 中不同) |
| 無返回值+無參數 | void func(void); | 最規範的「純副作用函數」聲明 |
int function(void) { return 1; } // 必須有返回值,因返回類型為 int
void* 指針的賦值規則int *p1 = NULL; char *p2 = (char *)malloc(sizeof(char) * 20); void *vp; // vp 作為左值:接收任意類型指針(隱式轉換) vp = p1; // OK vp = p2; // OK // vp 作為右值:賦值給具體類型指針需強制轉換 p1 = (int *)vp; // 必須強轉 p2 = (char *)vp; // 必須強轉
規則:void* 可隱式接收任何指針;輸出時必須顯式轉型,編譯器不會自動推導目標類型。
void v; —— 不存在 void 類型變量,編譯錯誤sizeof(void) —— void 無大小,編譯錯誤void *p; *p = 10; —— 無法解引用 void*,編譯器不知取幾字節void *p = &x; int *pi = (int*)p; *pi = 10; —— 轉型後解引用void* user_datavoid* datavoid* 隔離內部類型,內部實現轉型void* 繞過類型系統掌握 void 三大用法,能寫出類型安全又具備泛型能力的 C 代碼,是系統級編程的基本功。