c語言裏NULL的理解

ULL一看名字就知道爲空,什麼爲空呢,並且全是大寫。是否是意味着是個宏定義呢?若是想到這裏,我相信你離真理不遠了。
有些人爲何犯錯?由於只看到了NULL這四個字母而已,沒有看到事物的本質,老師在課堂上也只是說空指針,空字符串。。這樣只會陷入無止境的誤區。若是我這樣定義:
#define NULL 0
你是否是又該糾結了呢?
正確的作法是把它看成一個宏,無論如何變化,來展開看看就知道了。
在C語言的頭文件stddef.h中,NULL的定義以下:
#define NULL
#define __cplusplus  //若是定義了__cplusplus表示是c++程序
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
#interface 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語言視頻:http://www.makeru.com.cn/course/1861.html?v=emb_v1.1
嵌入式學習交流羣:561213221html

相關文章
相關標籤/搜索