筆記14 C語言中的NULL

2021-08-14 21:47:22 字數 1198 閱讀 3701

一.null不是c語言關鍵字,本質上是乙個巨集定義

二.null的標準定義:

#ifdef  _cplusplus

#define null 0

#else

#define null (void *)0 //對應c語言情況

#endif

解釋:c++的編譯環境中,編譯器預先定義了乙個巨集_cplusplus,程式中可以用條件編譯來判斷當前的編譯環境是c++的還是c的

null的本質解析:null的本質是0,但是這個0不是當乙個數字解析,而是當乙個記憶體位址來解析的,這個0其實是0x00000000,代表記憶體的0位址,(void *)0 這個整體表示式表示乙個指標,這個指標變數本身佔4位元組,位址在**取決於指標變數本身,但是這個指標變數的值是0,也就是說這個指標變數指向0位址(實際上是0位址開始的一段記憶體)。

三.從指標角度理解null的本質

1.

int *p;    // p是乙個函式內的區域性變數,則p的值是隨機的,也就是說p是乙個野指標

int *p = null; //p是乙個區域性變數,分配在棧上,我們不必關心,但是p的值是(void *)0,實際就是0,意思是指標p指向記憶體的0位址處。這個時候p就不是野指標了。

2.為什麼要讓乙個野指標指向記憶體的位址0處?

主要是因為在大部分的cpu中,記憶體的0位址處都不是隨便訪問的(一般都是作業系統嚴密管控區域,所以應用程式不能隨便訪問)。所以野指標指向這個區域可以保證野指標不會造成誤傷。如果程式無意識的解引用指向0位址處的野指標則會出發段錯誤。這樣就可以提示你幫助你找到程式中的錯誤。)

四.為什麼需要null?

1.第乙個作用就是讓野指標指向0位址處

2.第二個作用就是乙個特殊標記,按照標準的指標使用步驟是:

int *p = null; //定義p時初始化為null

p = xx;

. .

. p = null; //用完之後p再次等於null

五.注意不要混用null與』\0』

『\0』 和 『0』 和 0 和null區分開

1. 『\0』是乙個轉義字元,它對應的ascii編碼值是0,本質就是0

2. 『0』是乙個字元,它對應的ascii編碼值是48,本質是48

3. 0是乙個數字,他就是0,本質就是0

4. null是乙個表示式,是強制型別轉換為void *型別的0,本質是0

14 C語言 陣列

c 語言支援陣列資料結構,它可以儲存乙個固定大小的相同型別元素的順序集合。陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數。陣列的宣告並不是宣告乙個個單獨的變數,比如 number0 number1 number99,而是宣告乙個陣列變數,比如 numbers,然後使用 numbers...

1 4 C 語言基礎 陣列

type arrayname 宣告乙個int陣列 int arry 宣告的時候指定陣列的長度為5 這個時候的初始化值為0 int arry2 new int 5 宣告的時候初始化值 初始化的值個數必須和指定的長度匹配 int array3 new int 5 字串陣列 string arrstr 陣...

C語言基礎 1 4 C語言陣列

字元陣列與字串 字元陣列的輸入和輸出 字串拷貝 字串比較 字串連線 getch 函式包含在conio.h的標頭檔案中。避免資料溢位 3 1 include int main 3 2 include include int main else if a 2 0 else if a 4 0 else e...