国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網

標題: 細思則恐!C語言里NULL從本質上來理解 [打印本頁]

作者: 技術小白    時間: 2017-6-28 09:51
標題: 細思則恐!C語言里NULL從本質上來理解
細思則恐!C語言里NULL從本質上來理解

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
#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語言、電子、PCB、STM32、Linux、FPGA、JAVA、安卓等。
想學習的你和我聯系預約就可以免費聽課了。
宋工企鵝號:3524-6590-88   Tel/WX:173--1795--1908








歡迎光臨 電子工程網 (http://m.qingdxww.cn/) Powered by Discuz! X3.4
主站蜘蛛池模板: 青青草国产免费久久久91 | 在线看的成人性视频 | 国产精品66 | 在线a免费观看 | 精品国产欧美一区二区最新 | 五月天亚洲综合 | 久久艹艹 | 黄色在线免费网站 | 丁香六月啪啪 | 在线欧美日韩 | 亚洲综合偷自成人网第页 | 中文字幕一区二区三区视频在线 | 深夜福利国产精品亚洲尤物 | 在线国产欧美 | 久久精品国产免费一区 | h视频在线观看免费 | 999国产精品999久久久久久 | 色男人的天堂 | 一级毛片免费 | 免费爱豆传媒在线观看视频 | 精品视频在线免费观看 | 免费国产caob视频 | 久久蜜桃亚洲一区二区 | 亚洲一区二区影视 | 国产码欧美日韩高清综合一区 | 免费特黄级夫费生活片 | 特级做a爰片毛片免费看一区 | 青青草手机视频在线观看 | 久久久久综合给合狠狠狠 | 中文字幕一区二区三区免费看 | 亚洲天堂手机在线 | 992tv国产精品福利在线 | 尹人香蕉网在线观看视频 | 蘑菇香蕉茄子绿巨人丝瓜草莓 | 99精品在线视频观看 | 我的女儿韩国电视剧在线观看 | 久热99这里只有精品视频6 | 靠逼视频网站 | 欧美一区二区三区在线观看免费 | 黄a在线观看 | 免费国产在线视频 |