今天,有個師弟問我:「師兄,空指標和void *型別指標是怎樣的?」
當時,我大概的說法是:
1、空指標是沒有指向的指標,將暫時用不到的指標定義成空指標,能防止誤用。
2、而void * 型別的指標是有指向的指標,但它的指向的資料的型別暫時不確定,所以先弄成void * 型別,後期一般要強制轉換的。
回來後,發現這種說法雖然勉強能夠接受,但依然有不足的地方,現在補充更正一下:
1、空指標實質上是有指向的指標,但它指向的位址是很小的位址,約定俗成為位址0,我來解釋一下為什麼。
#include void main()
這個程式在語法上是沒有問題的,但是我們編譯、鏈結都沒有報錯,但是我們開啟的時候卻出錯了。
原因是空指標指向的位址是不儲存資料,同時不允許程式訪問的。
那麼,這個null到底是什麼呢?
我開啟了用f12對著null 單擊開啟,看看它到底是什麼,結果開啟了標頭檔案stdio.h,顯示#define null ((void *)0)
顯然,這是乙個巨集定義。null 實際上是((void*)0) ,容易看出,外層的括號純粹是為了防止歧義;裡層的括號則是強制型別轉換,轉換成void * 型別,本來void * 型別是用來存放位址的,那麼這裡的0自然就是位址0了。
在記憶體分配方面,較小的位址是不用來存放資料的,也不允許程式訪問的。所以,指標指向了它,就是這個指標不能操作它指向的這塊較小的位址。
哈哈,至此,空指標算是解釋通了。
簡單來說,空指標有指向,但是它指向的位址是特殊的,該位址不允許存放資料和不允許程式訪問,所以空指標不能操作該位址裡的東西,我們就理解為「指標指向了空,無法操作了」。
2、void * 型別指標,這個型別指標指向了實實在在的存放資料的位址,但是該位址存放的資料的資料型別我們暫時不知道。
舉個例子,我們的動態記憶體分配就是這樣,一開始只是分配位址,但沒有知道這塊位址用了存放什麼,接著強制型別轉換,使得它用來存放我們想要存放的內容。
char*str=(char*)malloc(sizeof(char)*13);
上面這條**,malloc()函式分配的位址一開始是void * 型別的,因為我們用來存放char型別資料,所以強制轉換為 char * 。
**:
空指標和void 指標
空指標不指向任何物件,在試圖使用乙個指標之前可以檢查它是否為空。以下列出幾個生成空指標的方法 int p1 nullptr int p2 0 int p3 null 得到空指標最直接的辦法就是用字面值nullptr來初始化指標,這是c 11新標準引入的一種方法。nullptr是一種特殊型別的字面值,...
3 1 28 void型別指標和空指標詳解
1 void 指標宣告 void main300 2 void 指標用途 void 可以接收任何型別指標的賦值,任何指標都可以賦值給空型別的指標,用於儲存位址 void main301 3 學習函式memset memset返回值就是乙個空型別,作用是對記憶體沒意義位元組進行挨個挨個賦值 void ...
空型別指標(void 的理解
原文 void指標是空型別指標,它不指向任何型別,即void指標僅僅是乙個位址,所以空型別指標不能進行指標運算 也不能進行間接引用 因為指標運算和間接引用都需要指標的型別資訊 例如 void p 僅僅表示p存放乙個位址 p error 運算離不開指標型別 p 20.5 error 訪問p指向的變數空...