您的位置:首頁>正文

C語言中什麼叫做平胸的小妹,什麼叫做丰韻的美女,是不是很驚奇

為什麼寫這篇文章呢? 為什麼要弄這麼個題目呢?

學習資料, 學習視頻, 直播課程, 專業解答C/C++:9群:99816772

首先解釋為什麼用這個題目。 這一切都要從那天在和群友的討論說起,

那天在群中, 一個哥們問了一個關於(void)0 的問題。 然後大家說到了

(void)0和(void*)0; 大家看看(void)0 和(void*)0 , 是不是一個像個平胸的小妹, 一個像個丰韻的美女。

他問的的問題如下:

學習資料, 學習視頻, 直播課程, 專業解答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類型都將返回一個不存在的值,

因此也就不能將void轉換為其他非空類型。

2、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請點擊此處輸入圖片描述

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示