在c/c++中的標準定義:
#ifdef __cplusplus //條件編譯,判斷是c++還是c環境
#define null 0 //c++環境
#else
#define null ((void *)0) //c語言環境
#endif
#endif
在c語言中的null就被替換成了((void *)0),這個整體表示的是乙個指標,即是指向0位址的viod型別的指標。
所以我們可以理解為null的本質就是0,這個0要看做位址,即是0x00000000。
null為什麼出現,就得明白什麼是野指標了。
又叫迷途指標,即指標指向的位址是隨機的。(不指向任何合法的物件的指標)
指標變數在定義後,不去初始化。這個時候,值就是隨機的。這時候這個指標變數就是野指標。
比如在棧裡定義了乙個指標變數,即棧給這個指標變數分配了乙個記憶體,而這個記憶體裡存的值就是該指標指向的位址,然而棧是髒的(反覆使用,不擦除),並不知道位址裡存的什麼數,也就不知道指標指向了**。
指標變數在定義後,不去初始化,這個時候,值就是隨機的,即指向了隨機的一段記憶體。我們再去解引用時,就是去訪問乙個隨機位址,那麼會有什麼樣的後果也是未知的。
一般有三種情況:
①指向了不可訪問的位址(系統不允許訪問的地方)
這種情況是最好的,因為程式會報段錯誤,無法執行。
②指向了可用的,暫時沒有用到的地方(譬如程式沒有用到的堆疊位址)
這種情況執行時沒問題,也不會報錯。但是實際上程式是有問題的,假如之後程式由於野指標出現了bug,就死活找不到原因了。
③指向了可用的,並且是程式中正在被使用的地方
這種情況野指標的解引用可能就會導致指向的那段記憶體的值被修改,出現一些離奇的錯誤,導致程式崩潰,資料破壞,損壞。
打個比方:野指標就是個山賊,隨機的搶劫過路商隊。
第一種情況就是
(不可訪問的位址)大型商隊保鏢太強,山賊(野指標)正準備搶劫就被乾掉了,並向後面(我們)的商隊發出了警告
第二種情況就是
(可以訪問,暫時沒用使用的位址)小型商隊,山賊就直接搶了,暫時並不影響繞路的我們。
第三種情況就是
(程式正在使用)我們的商隊,山賊可能搶的可能我們沒法活下去(程式崩潰)
在指標的解引用之前,一定確保指標指向乙個絕對可用的空間。
這時候null出現的很及時,常規做法
①定義指標後,將指標初始化為null。
②指標使用之前繫結乙個可用位址。
③在指標解引用前,去判斷是否為null。
④使用完,後賦值為null。
1 int a = 1;
2 int *p = null; //定義指標並初始化為null
3 p = &a; //繫結乙個可用位址
4
5 if (null != p) //判斷是否不等於null
6 9
10 p = null; //使用完,重新賦值為null
注意(小技巧):
一般將判斷指標是否相等時,不寫成if (p == null),而寫成if (null == p),原因是== 與 = 的誤錯,程式的意思會不一樣。等號少寫後,if (p = null)不會報錯,if (null = p)會報錯。
①讓野指標指向乙個 '安全的0位址處'
大部分cpu中,記憶體0位址處不能隨便訪問的,所以避免野指標的誤傷,指向0位址後的使用就會報段錯誤。幫助我們找錯誤。
②特殊標記,即增加程式的可讀性。
表示指標是個野指標。
①'\0'是個轉義字元,ascii編碼值是0,本質就是0.
'\0'用法是c語言字串的結尾標誌
②'0'是個字元,ascii編碼值是48,即是48
'0'是字元0,獲取ascii編碼值
③0是數字0,本質也是0
比較乙個int型別的數字是否等於0,或者給變數賦值。
④null是個表示式((void *)0),強制轉換為void * 的0,本質也是0
用來比較指標是否是乙個野指標
出處:
const關鍵字與指標
1 const修飾指標的四種形式 a.const是關鍵字,在c語言中原來修飾變數,表示這個變數是常量。const int inum 10 和 int const inum 10 的效果是一樣的。b.const修飾指標有4種形式。區分清楚這4種即可全部理解const和指標。1 const int p ...
const關鍵字與指標
const關鍵字與指標 const修飾指標的4種形式 1 const.關鍵字,在c語言中用來修飾變數,表示這個變數是常量。2 const修飾指標有4種形式,區分清楚這4種即可全部理解const和指標。第一種 const int p 第二種 int const p 第三種 int const p 第四...
const 關鍵字與指標
一.入門 概念引入 定義乙個 int 型別的普通變數 val 假設它的值是 10。再定義乙個指向該變數的指標 val ptr 它儲存了 val 的位址。1 int val 10 2 int val ptr val 乙個 int 型別的變數儲存的是 int 型別的值,同理,乙個指向 int 型別的指標...