void在C語言中看似簡單,實則蘊含核心類型系統設計。本文梳理五大用法與指針本質。
void = 「無類型」void * = 「無類型指針」,可指向任意類型數據典型案例:內存操作函數
void *memcpy(void *dest, const void *src, size_t len);
void *memset(void *buffer, int c, size_t num);
int InitHardEnv(void **handle); // 雙重指針傳出句柄
void*屏蔽具體類型,實現「一套代碼處理所有類型數據」。
void func()int func(void)(C標準寫法,區別於int func()舊式聲明)C規定:只有相同類型指針才能直接賦值。
void*作左值可「接收」任意類型指針;作右值賦給其他指針需強制轉型。
int *p1 = NULL;
char *p2 = (char*)malloc(sizeof(char)*20);
void *vp = p1; // 左值:接收int* ✓
vp = p2; // 左值:接收char* ✓
p1 = (int*)vp; // 右值:需強轉回int* ✓
p1 = vp; // 錯誤:void*不能隱式轉int*
C標準未定義void佔用內存大小,故不可聲明void a;。void僅用於類型系統佔位,非完整對象類型。
| 場景 | 關鍵點 |
|---|---|
| 函數無返回/無參 | 語義明確,規篼聲明 |
| 泛型接口 | void*擦除類型,配合強轉還原 |
| 指針賦值 | 左值通吃、右值必轉,編譯器強制類型安全 |
| 變量聲明 | 禁止,因無尺寸 |
理解void機制,是掌握C語言類型系統與泛型編程的關鍵一步。