一.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...