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

查看: 2808|回復(fù): 0
打印 上一主題 下一主題

細(xì)思則恐!C語言里NULL從本質(zhì)上來理解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2017-6-28 09:51:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: C語言 , null
細(xì)思則恐!C語言里NULL從本質(zhì)上來理解

NULL一看名字就知道為空,什么為空呢,而且全是大寫。是不是意味著是個(gè)宏定義呢?如果想到這里,我相信你離真理不遠(yuǎn)了。

有些人為什么犯錯(cuò)?因?yàn)橹豢吹搅薔ULL這四個(gè)字母而已,沒有看到事物的本質(zhì),老師在課堂上也只是說空指針,空字符串。。這樣只會陷入無止境的誤區(qū)。如果我這樣定義:

#define NULL 0

你是不是又該糾結(jié)了呢?

正確的做法是把它當(dāng)作一個(gè)宏,不管如何變化,來展開看看就知道了。

在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的本質(zhì)是(void *)0。

這里一開始就犯了個(gè)錯(cuò),強(qiáng)制轉(zhuǎn)換的意義是什么??感謝朱老師物聯(lián)網(wǎng)大課堂的朱老師以及群里的朋友們的激烈討論。以下內(nèi)容截取自我們的討論。

((void *)0) 本質(zhì)上是將數(shù)字0強(qiáng)制轉(zhuǎn)換為(void *)。

0其實(shí)就是地址,(void *)只是說我們認(rèn)為0這個(gè)地址中存儲的類型是void *,也就是說0這個(gè)地址中存儲的類型是void的,也就是當(dāng)前不知道還未指定的。

0 地址是虛擬地址 還是物理地址?

不管是虛擬還是物理地址,就是當(dāng)前環(huán)境的0地址。

要理解強(qiáng)制類型轉(zhuǎn)換的本質(zhì)

0還是0,永遠(yuǎn)是0,表示的永遠(yuǎn)是0這個(gè)內(nèi)存地址;前面的類型,只是告訴我們我們認(rèn)為0這個(gè)地址中裝了什么

首先 這里的數(shù)字0 就是表示地址0???

不能講某個(gè)數(shù)字直接強(qiáng)制轉(zhuǎn)化為指針嗎

舉個(gè)例子就可以了:

#define GPJ0CON (unsigned int *)0x20008000

如果是需要將一個(gè)數(shù)字強(qiáng)制轉(zhuǎn)換為指針,是不是可以這樣寫呢 int * &2, 是不是強(qiáng)制講2轉(zhuǎn)化為指針類型了呢

這樣啊 (unsigned int *)0x2
char i=2; 間接講2轉(zhuǎn)換為int 指針。是不是這樣寫int * &i
char i = 2;之后 編譯器會給i變量分配一個(gè)地址,&i 就是取i變量的地址。變量定義后就會分配地址。

我說的0,你這里寫的2本身這個(gè)數(shù)字就是表示地址,而你的理解是2是值,這個(gè)值存在一個(gè)變量中,所以想通過&2去取2的地址,這個(gè)是錯(cuò)誤的。因?yàn)橹挥凶兞坎庞械刂罚?只是個(gè)數(shù)字是沒有地址的。

而單純的數(shù)字本身就是地址。

是的,在這里確實(shí)是這樣,因?yàn)檫@個(gè)數(shù)字我們要把它強(qiáng)制類型轉(zhuǎn)化成指針,所以這個(gè)數(shù)字就是地址

C語言里有很多東西都是這種,規(guī)則只是講了法律,但是實(shí)際應(yīng)用中有很少常用技巧、或者衍生出來的用法,都沒有提及,這也是我們的C高級課程中需要補(bǔ)充的。

因?yàn)橹挥凶兞坎庞械刂罚?只是個(gè)數(shù)字是沒有地址的.因?yàn)檫@個(gè)數(shù)字我們要把它強(qiáng)制類型轉(zhuǎn)化成指針,所以這個(gè)數(shù)字就是地址

C語言中就通過類型來表示這個(gè)單元中存的什么玩意,譬如(int)0就表示0地址中存的是int型的數(shù);譬如你(int *)0就表示0地址中存的是個(gè)地址,這個(gè)地址指向的單元是int型數(shù)

NULL只是一個(gè)概念,叫作空值,其值本身沒有任何含義,可以用0代替,也可以用1,...代替,只要這些值不會與系統(tǒng)實(shí)際的有效地址沖突即可。

因此,本人在此再次強(qiáng)調(diào),不要自作聰明地認(rèn)為NULL就是0,要判斷的時(shí)候還是老老實(shí)實(shí)地與NULL做比較,別想當(dāng)然地用什么!ptr之類的寫法,因?yàn)樵谀硞(gè)特定環(huán)境下,NULL可能不是0,而系統(tǒng)函數(shù)返回的是NULL不是0,那時(shí),你的函數(shù)就會出現(xiàn)莫名其妙的錯(cuò)誤。所以,養(yǎng)成良好的習(xí)慣是非常重要的。

從這里學(xué)到了一點(diǎn) 如果看到了一個(gè)宏不會用 那么最好的辦法 不是去看別人的解釋 而是展開它,看它的最終展開形式。

總結(jié)如下:

C語言中NULL表示內(nèi)存位置0,NULL((void *)0)指針并不指向任何對象。因此除非是用于賦值或比較運(yùn)算,出于其他任何目的使用NULL指針都是非法的。

注意:在ASCII碼的第一個(gè)字符是NULL,它的數(shù)值是0,占用1字節(jié);c語言把它作為字符串的最后一個(gè)字符,以表示字符串到此結(jié)束."\0"

接下來:總結(jié)下NULL具體用在哪些場合。

第一:指針初始化(對應(yīng)于上面的賦值)。
例如 int *x = NULL;

第二:函數(shù)返回是否成功判斷(對應(yīng)于做比較運(yùn)算)。
當(dāng)函數(shù)返回值為指針時(shí),判斷函數(shù)是否返回成功。舉例如下:

FILE * pFile;
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL) printf("open error");


第三:判斷字符串是否為空字符串(對應(yīng)于做比較運(yùn)算)。
if(str==NULL)或者if(str[0]=='\0') 就是空


以下課程可免費(fèi)試聽C語言、電子、PCB、STM32、LinuxFPGA、JAVA、安卓等。
想學(xué)習(xí)的你和我聯(lián)系預(yù)約就可以免費(fèi)聽課了。
宋工企鵝號:3524-6590-88   Tel/WX:173--1795--1908



您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产又湿又黄又硬又刺激 | 在线免费看黄的网站 | 国产在线91区精品 | 高清色本在线www | 青青青国产在线观看免费网站 | 在线五月婷婷 | 五月间天堂 | 在线精品国产一区二区 | 日韩色吧 | 国产在线精品一区二区中文 | 忍者刺客韩国在线观看完整免费版 | 欧美日韩精品一区三区 | 无人视频完整免费版视频观看下载 | 亚洲一区二区三区首页 | 一级毛片成人免费看a | 99在线观看视频免费 | 亚洲片在线 | 亚洲视频毛片 | 国产激情自拍视频 | 花季传媒v3084下载入口 | 日本经典影片免费在线看 | 四虎精品免费久久 | 国产精品久久久久久久久久妇女 | 日日干夜夜拍 | 久久综合结合久久很很很97色 | 久久久久久免费视频 | 在线精品日韩一区二区三区 | 一区二区视频在线播放 | 日韩免费视频一区 | 成人亚欧网站在线观看 | 花季传媒3.0.3每天免费3次 | 欧美在线观看网址 | 高清一区二区亚洲欧美日韩 | 在线视频一区二区 | 69免费在线视频 | 色综合视频在线观看 | 欧美日本一道道一区二区三 | 茄子香蕉草莓丝瓜芭乐绿巨人 | 欧美一区高清 | 日韩精品视频一区二区三区 | 看黄a大片 免费 |