void =「無類型」,void* =「無類型指針」,可指向任意類型的數據對象。
void func(int, int);int func(void); (C++ 中 int func(); 等價,但 C 中不同)
int* pInt = new int(42);
void* pVoid = pInt; // 合法:無類型可包容有類型
int* pInt2 = pVoid; // 錯誤:不能隱式從 void* 轉換
int* pInt3 = (int*)pVoid; // 正確:C 風格強轉
int* pInt4 = static_cast(pVoid); // 推薦:C++ 風格
道理:「人是男人或女人」成立,「男人是人」成立,但「人是男人」不成立。
void* 算術運算(pVoid++、pVoid + 1),因為不知道對象大小void* 算術,視同 char*(按 1 字節遞增)(char*)pVoid + n 或 (uint8_t*)pVoid + n
void* memcpy(void* dest, const void* src, size_t n);
void* memset(void* s, int c, size_t n);
void* 接受任意類型緩衝區void* 便於鏈式調用
void a; // 編譯錯誤:illegal use of type 'void'
void func(void a); // 錯誤
void 是抽象類型(類比抽象基類),不可實例化。只有「有類型」的對象才能存在於內存中。
| 特性 | C (ANSI C89/C99) | C++ |
|---|---|---|
func() 無參聲明 | 接受任意參數調用 | 不接受任何參數 (等價 func(void)) |
| 無返回類型函數 | 默認 int | 編譯錯誤,必須顯式聲明 |
void* 算術 | 標準禁止,GNU 允許 | 同 C,遵循編譯器實現 |
☐ 無返回值函數必須聲明void
☐ 無參函數 C++ 建議寫void,C 必須寫void
☐void*只作為「不關心類型的內存塊」傳遞
☐void*轉具體類型必須static_cast
☐void*算術統一轉char*或uint8_t*
☐ 絕不定義void變量或參數
void是類型系統的「底類型」,表達「無類型」抽象。
void*是通用內存地址的統一表示,橋接強類型與無類型世界。
嚴守轉換規則、算術限制、不可實例化三大鐵律,代碼才安全、可移植、可維護。