為什麼寫這篇文章呢? 為什麼要弄這麼個題目呢?
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
首先解釋為什麼用這個題目。 這一切都要從那天在和群友的討論說起,
他問的的問題如下:
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
我想了一下這個語句應該沒有什麼問題, 在沒有用(void)0, 去影響記憶體物件的情況下, 應該是可以的。 下面是我在vs2013中進行測試的結果。
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
可以發現, 編譯過程沒有警告和錯誤資訊。
然後, 我們就討論是否可以將(void)0 賦值給其他的物件, 於是我就修改了一下, 將其改成賦值。
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
可以看出, void類型不能通過隱式類型轉換為int類型。
既然我們不能將void類型的值賦值, 那麼定義void類型的變數呢?
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
可以發現, 不能將變數定義為void類型。
下面我們來討論一下整個過程。
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
1、void類型void表示為無類型, 在 K&R C 裡面有明確的說明。
因為不能在Linux下上傳圖片, 所以就不上傳圖片裡, 可以到 K&R 第二版的 附錄 A.6.7 查看相關的內容。
K&R C裡面明確的指出: void類型物件的值不能以任何方式使用, 也不能顯式或者隱式的轉換為非空類型。 void類型表示
一個不存在的值, 任何物件轉換為void類型都將返回一個不存在的值,
【1】聲明函數不需要返回任何值
這個需要注意下面兩個函式定義的差別:
getx(); //函數1void getx(); //函數2注意:函數1和函數2是兩個不一樣的函數。
【2】聲明函數不需要傳遞任何
getx(); //函數1getx(void); //函數2注意:函數1和函數2 一樣。
【3】返回void物件的運算式語句, 作用和空語句一樣。
(void)x; // 空對象運算式語句; //空語句在編譯的時候, 編譯優化後, 這兩個語句都不產生任何實際代碼。
3、void* 類型
指向任何物件的指標都可以轉換為void* 類型, 而且在轉換過程中不會丟失資訊;一個被轉換為void* 類型的指標可以轉換為初始類型,
並且在轉換的過程中不會丟失資訊。
char *p="Hello world";char *pVoid = (void*)p;下面是我的測試代碼:
學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772
可以看到, 這樣的結果符合原本的定義。 分析代碼中的第7行語句, 首先將p指標顯式的轉換為(void*); 然後再將空類型指標(void*)p隱式的轉換為char*, 可以看到
這個過程沒有丟失資訊。
這裡我們可以看到: 挺拔的void*可以任意的和別人交往, 而平胸的void成了嫁不出去的姑娘。
實際上: void* 指標也是一個指標, 具有普通指標的某些特性,例如 sizeof(void *)具有和sizeof(char *)一樣的大小,也就是說,void* 變數同樣佔用4個位元組(32位元系統),這個
記憶體位置,同樣可以存儲一個記憶體位址。而設置void*的一個目的就是無需進行顯式位址轉換就可以將void* 指標轉換為其他任意指標, 因為最初的時候,是用char* 做這個功能的。
這樣每一次進行轉換的時候,都必須將char* 指標進行強制類型轉換。
這個地方,就不再細說了,在C語言中,(void)0註定有平胸姑娘的尷尬,成了嫁不出去的姑娘。
學習資料,學習視頻,直播課程,專業解答C/C++:9群:99816772請點擊此處輸入圖片描述
具有普通指標的某些特性,例如 sizeof(void *)具有和sizeof(char *)一樣的大小,也就是說,void* 變數同樣佔用4個位元組(32位元系統),這個記憶體位置,同樣可以存儲一個記憶體位址。而設置void*的一個目的就是無需進行顯式位址轉換就可以將void* 指標轉換為其他任意指標, 因為最初的時候,是用char* 做這個功能的。
這樣每一次進行轉換的時候,都必須將char* 指標進行強制類型轉換。
這個地方,就不再細說了,在C語言中,(void)0註定有平胸姑娘的尷尬,成了嫁不出去的姑娘。
學習資料,學習視頻,直播課程,專業解答C/C++:9群:99816772請點擊此處輸入圖片描述