c語言裡NULL的理解

2021-07-03 10:51:37 字數 2399 閱讀 3794

null一看名字就知道為空,什麼為空呢,而且全是大寫。是不是意味著是個巨集定義呢?如果想到這裡,我相信你離真理不遠了。

有些人為什麼犯錯?因為只看到了null這四個字母而已,沒有看到事物的本質,老師在課堂上也只是說空指標,空字串。。這樣只會陷入無止境的誤區。如果我這樣定義:

#define null 0

你是不是又該糾結了呢?

正確的做法是把它當作乙個巨集,不管如何變化,來展開看看就知道了。

在c語言的標頭檔案stddef.h中,null的定義如下:

#define null

#define __cplusplus  //如果定義了__cplusplus表示是c++程式

#define null 0

#else

#define null ((void *)0)

#endif

#endif

#inte***ce null 0

所以,c語言裡null的本質是(void *)0。

這裡一開始就犯了個錯,強制轉換的意義是什麼??感謝朱老師物聯網大課堂的朱老師以及群裡的朋友們的激烈討論。以下內容擷取自我們的討論。

((void *)0)  本質上是將數字0強制轉換為(void *)。0其實就是位址,(void *)只是說我們認為0這個位址中儲存的型別是void *,也就是說0這個位址中儲存的型別是void的,也就是當前不知道還未指定的.

0 位址是虛擬位址  還是實體地址?

不管是虛擬還是實體地址,就是當前環境的0位址。

要理解強制型別轉換的本質

0還是0,永遠是0,表示的永遠是0這個記憶體位址;前面的型別,只是告訴我們我們認為0這個位址中裝了什麼

首先 這裡的數字0  就是表示位址0???

不能講某個數字直接強制轉化為指標嗎

舉個例子就可以了:

#define gpj0con (unsigned int *)0x20008000

如果是需要將乙個數字強制轉換為指標,是不是可以這樣寫呢 int * &2, 是不是強制講2轉化為指標型別了呢

這樣啊   (unsigned int *)0x2

char i=2; 間接講2轉換為int 指標。是不是這樣寫int * &i

char i = 2;之後 編譯器會給i變數分配乙個位址,&i  就是取i變數的位址。變數定義後就會分配位址。

我說的0,你這裡寫的2本身這個數字就是表示位址,而你的理解是2是值,這個值存在乙個變數中,所以想通過&2去取2的位址,這個是錯誤的。因為只有變數才有位址,2只是個數字是沒有位址的。

而單純的數字本身就是位址。

是的,在這裡確實是這樣,因為這個數字我們要把它強制型別轉化成指標,所以這個數字就是位址

c語言裡有很多東西都是這種,規則只是講了法律,但是實際應用中有很少常用技巧、或者衍生出來的用法,都沒有提及,這也是我們的c高階課程中需要補充的。

因為只有變數才有位址,2只是個數字是沒有位址的.因為這個數字我們要把它強制型別轉化成指標,所以這個數字就是位址

c語言中就通過型別來表示這個單元中存的什麼玩意,譬如(int)0就表示0位址中存的是int型的數;譬如你(int *)0就表示0位址中存的是個位址,這個位址指向的單元是int型數

null只是乙個概念,叫作空值,其值本身沒有任何含義,可以用0代替,也可以用1,...代替,只要這些值不會與系統實際的有效位址衝突即可。 

因此,本人在此再次強調,不要自作聰明地認為null就是0,要判斷的時候還是老老實實地與null做比較,別想當然地用什麼!ptr之類的寫法,因為在某個特定環境下,null可能不是0,而係

統函式返回的是null不是0,那時,你的函式就會出現莫名其妙的錯誤。所以,養成良好的習慣是非常重要的。

從這裡學到了一點  如果看到了乙個巨集不會用   那麼最好的辦法 不是去看別人的解釋  而是展開它,看它的最終展開形式。

總結如下:

c語言中null表示記憶體位置0,null((void *)0)指標並不指向任何物件。因此除非是用於賦值或比較運算,出於其他任何目的使用null指標都是非法的。

注意:在ascii碼的第乙個字元是null,它的數值是0,占用1位元組;c語言把它作為字串的最後乙個字元,以表示字串到此結束."\0"

接下來:總結下null具體用在哪些場合。

第一:指標初始化(對應於上面的賦值)。

例如 int *x = null;

第二:函式返回是否成功判斷(對應於做比較運算)。

當函式返回值為指標時,判斷函式是否返回成功。舉例如下:

file * pfile;

pfile = fopen ("myfile.txt" , "r");

if (pfile == null) printf("open error");

第三:判斷字串是否為空字串(對應於做比較運算)。

if(str==null)或者if(str[0]=='\0') 就是空   

c語言裡緩衝區的理解

從乙個簡單的例子開始 可以看到沒等第二次的關鍵字的輸入程式就執行結束了,這是為什麼呢?要充分理解這個問題我們需要理解c語言中對緩衝區的概念。在這之前我們初步分析一下,scanf函式輸入字串的的情況下空白字元 空格,回車,tab 都只是被視為分隔符,關於這一點可以參考c語言中scanf與分隔符 空格回...

c語言裡緩衝區的理解

從乙個簡單的例子開始 cpp view plain copy include int main include int main 12 3456 78910 1112 1314 1516 17可以看到沒等第二次的關鍵字的輸入程式就執行結束了,這是為什麼呢?要充分理解這個問題我們需要理解c語言中對緩衝...

C語言裡的for

for迴圈感覺是比較有技術含量的乙個知識點,很容易繞暈過去,特別是for迴圈的巢狀語句,總是有種不知道應該怎麼往下看的無措感。但是for迴圈其實還有點意思,特別是在我用它能輸出菱形之後,越發覺得好神奇。首先總結for的知識點 格式如下 for 表示式1 表示式2 表示式3 語句表示式1 賦初值,只執...