C C 語言中的NULL

2021-09-01 03:04:46 字數 1142 閱讀 3370

null不是c語言關鍵字,本質上是乙個巨集定義。c++的編譯環境中,編譯器預先定義了乙個巨集_cplusplus,程式中可以用條件編譯來判斷當前的編譯環境是c++的還是c的。

null的標準定義

#ifdef _cplusplus // 條件編譯

#define null 0

#else

#define null (void *)0 // 這裡對應c語言的情況,null是乙個表示式,是強制型別轉換為void *型別的0,本質是0

#endif

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

從指標角度理解null的本質

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

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

(3)為什麼要讓乙個野指標指向記憶體位址0處?主要是因為在大部分的cpu中,記憶體的0位址處都不是可以隨便訪問的(一般都是作業系統嚴密管控區域,應用程式不能隨便訪問)。

為什麼需要null

(1)第乙個作用就是讓野指標指向0位址處安全。

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

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

p = xx;

if (null != p)

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

注意:一般比較乙個指標和null是否相等不寫成if (p == null),而寫成if (null == p)。原因是第一種寫法中如果不小心把寫成了=,則編譯器不會報錯,但是程式的意思完全不一樣了;而第二種寫法如果不小心把寫成了=則編譯器會發現並報錯。

C C 語言中的計時函式

1.中函式clock 返回 型別clock t,精確度,毫秒級別 include include include void test int main void 2.最精確的計時 queryperformancecounter來查詢定時器的計數值,如果硬體裡有定時器,它就會啟動這個定時器,並且不斷獲...

C C 語言中的計時函式

1.中函式clock 返回型別clock t,精確度,毫秒級別 cpp view plain copy print?font size 18px include include include void test int main void include include include void ...

C C 語言中const的用法

c 中的const正常情況下是看成編譯期的常量,編譯器並不為const分配空間,只是在編譯的時候將期值儲存在名字表中,並在適當的時候折合在 中.所以在c 中const修飾的量可以用在陣列的定義中。而在c中,const是乙個不能被改變的普通變數 既然是變數,就要占用儲存空間,所以編譯器不知道編譯時的值...