空指針和void *類型指針


今天,有個師弟問我:“師兄,空指針和void *類型指針是怎樣的?”

當時,我大概的說法是:

1、空指針是沒有指向的指針,將暫時用不到的指針定義成空指針,能防止誤用。

2、而void * 類型的指針是有指向的指針,但它的指向的數據的類型暫時不確定,所以先弄成void * 類型,后期一般要強制轉換的。

 

回來后,發現這種說法雖然勉強能夠接受,但依然有不足的地方,現在補充更正一下:

1、空指針實質上是有指向的指針,但它指向的地址是很小的地址,約定俗成為地址0,我來解釋一下為什么。

#include <stdio.h>
void main(){
int * str = NULL;
gets(str);
printf("%s",str);
}
這個程序在語法上是沒有問題的,但是我們編譯、鏈接都沒有報錯,但是我們打開的時候卻出錯了。
原因是空指針指向的地址是不保存數據,同時不允許程序訪問的。

那么,這個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 *  。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM