国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C > 正文

解析C語言中空指針、空指針常量、NULL & 0的詳解

2020-01-26 16:14:12
字體:
來源:轉載
供稿:網友
什么是空指針常量(null pointer constant)?

[6.3.2.3-3] An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.

這里告訴我們:0、0L、'/0'、3 - 3、0 * 17 (它們都是“integer constant expression”)以及 (void*)0 (tyc: 我覺得(void*)0應該算是一個空指針吧,更恰當一點)等都是空指針常量(注意 (char*) 0 不叫空指針常量,只是一個空指針值)。至于系統選取哪種形式作為空指針常量使用,則是實現相關的。一般的 C 系統選擇 (void*)0 或者 0 的居多(也有個別的選擇 0L);至于 C++ 系統,由于存在嚴格的類型轉化的要求,void* 不能象 C 中那樣自由轉換為其它指針類型,所以通常選 0 作為空指針常量(tyc: C++標準推薦),而不選擇 (void*)0。

什么是空指針(null pointer)?

[6.3.2.3-3] If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

因此,如果 p 是一個指針變量,則 p = 0;、p = 0L;、p = '/0';、p = 3 - 3;、p = 0 * 17; 中的任何一種賦值操作之后(對于 C 來說還可以是 p = (void*)0;), p 都成為一個空指針,由系統保證空指針不指向任何實際的對象或者函數。反過來說,任何對象或者函數的地址都不可能是空指針。(tyc: 比如這里的(void*)0就是一個空指針。把它理解為null pointer還是null pointer constant會有微秒的不同,當然也不是緊要了)

什么是 NULL?

[6.3.2.3-Footnote] The macro NULL is defined in <stddef.h> (and other headers) as a null pointer constant

即 NULL 是一個標準規定的宏定義,用來表示空指針常量。因此,除了上面的各種賦值方式之外,還可以用 p = NULL; 來使 p 成為一個空指針。(tyc:很多系統中的實現:#define NULL (void*)0,與這里的“a null pointer constant”并不是完全一致的)

空指針(null pointer)指向了內存的什么地方(空指針的內部實現)?

標準并沒有對空指針指向內存中的什么地方這一個 問題作出規定,也就是說用哪個具體的地址值(0x0 地址還是某一特定地址)表示空指針取決于系統的實現。我們常見的空指針一般指向 0 地址,即空指針的內部用全 0 來表示(zero null pointer,零空指針);也有一些系統用一些特殊的地址值或者特殊的方式表示空指針(nonzero null pointer,非零空指針),具體請參見C FAQ。

幸運的是,在實際編程中不需要了解在我們的系統上空指針到底是一個 zero null pointer 還是 nonzero null pointer,我們只需要了解一個指針是否是空指針就可以了――編譯器會自動實現其中的轉換,為我們屏蔽其中的實現細節。注意:不要把空指針的內部表示等同于整數 0 的對象表示――如上所述,有時它們是不同的。

如何判斷一個指針是否是一個空指針?

這可以通過與空指針常量或者其它的空指針的比較來實現(注意與空指針的內部表示無關)。例如,假設 p 是一個指針變量,q 是一個同類型的空指針,要檢查 p 是否是一個空指針,可以采用下列任意形式之一――它們在實現的功能上都是等價的,所不同的只是風格的差別。

指針變量 p 是空指針的判斷:
if ( p == 0 )
if ( p == '/0' )
if ( p == 3 - 3 )
if ( p == NULL ) /* 使用 NULL 必須包含相應的標準庫的頭文件 */
if ( NULL == p )
if ( !p ) <---------------(這里和下面的if(p)都被專門說過一次,null定義不一定是0.這里如果貿然使用!p會很危險的.所以這種寫法不能被提倡)
if ( p == q )
...

指針變量 p 不是空指針的判斷:
if ( p != 0 )
if ( p != '/0' )
if ( p != 3 - 3 )
if ( p != NULL ) /* 使用 NULL 必須包含相應的標準庫的頭文件 */
if ( NULL != p )
if ( p )
if ( p != q )
...
可以用 memset 函數來得到一個空指針嗎?

這個問題等同于:如果 p 是一個指針變量,那么

memset( &p, 0, sizeof(p) ); 和 p = 0;

是等價的嗎?

答 案是否定的,雖然在大多數系統上是等價的,但是因為有的系統存在著“非零空指針” (nonzero null pointer),所以這時兩者不等價。由于這個原因,要注意當想將指針設置為空指針的時候不應該使用 memset,而應該用空指針常量或空指針對指針變量賦值或者初始化的方法。
可以定義自己的 NULL 的實現嗎?兼答"NULL 的值可以是 1、2、3 等值嗎?"類似問題

[7.1.3-2] If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined.

NULL 是標準庫中的一個符合上述條件的 reserved identifier (保留標識符)。所以,如果包含了相應的標準頭文件而引入了 NULL 的話,則再在程序中重新定義 NULL 為不同的內容是非法的,其行為是未定義的。也就是說,如果是符合標準的程序,其 NULL 的值只能是 0,不可能是除 0 之外的其它值,比如 1、2、3 等。

malloc 函數在分配內存失敗時返回 0 還是 NULL?

malloc 函數是標準 C 規定的庫函數。在標準中明確規定了在其內存分配失敗時返回的是一個 “null pointer”(空指針):

[7.20.3-1] If the space cannot be allocated, a null pointer is returned.

對于空指針值,一般的文檔(比如 man)中傾向于用 NULL 表示,而沒有直接說成 0。但是我們應該清楚:對于指針類型來說,返回 NULL 和 返回 0 是完全等價的,因為 NULL 和 0 都表示 “null pointer”(空指針)。(tyc:一般系統中手冊中都返回NULL,那我們就用NULL吧)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品视频一区二区三区麻豆 | 欧美精品久久久久久久小说| 国产视频精品久久| 综合激情丁香| 伊人伊人av电影| 国产对白国语对白| www中文字幕在线观看| 国产美女视频一区二区三区| 天堂在线免费观看| 国产色婷婷在线| av日韩在线免费| 天堂在线中文资源| 资源视频在线播放免费| 91社区在线观看| www久久日com| 精品一区二区三区在线成人| 欧美日韩在线精品成人综合网| 国产尤物一区二区三区| 精品久久av| 天堂资源在线中文| 伊人伊人av电影| 国产精品xxx电影| 免费a在线看| 99热免费观看| 国产一级黄色电影| 欧美大交乱xxxx| 精品国产免费第一区二区| 人人九九精品| 国产95在线|亚洲| 国产美女极品在线| gogo在线观看| 亚洲夜夜综合| 91香蕉视频免费在线观看| 国产一区二区三区不卡免费观看| a视频在线观看免费| 亚洲图区欧美| 在线观看精品视频一区二区三区 | 国产毛片在线| 亚洲妇熟xxxx妇色黄| 国产九九九九| 九九99九九精彩| www.av在线播放| 在线午夜视频| 中文天堂av| 99在线视频观看| 精品伦理一区二区| 2019中文字幕在线电影免费| 99视频资源网| 国产一起色一起爱| 国产精品臀控福利在线观看| 欧美色第一页| 天天av天天爱| 2020国产在线视频| 精品国产丝袜高跟鞋| 18 激情视频在线| 在线中文字幕av| eeuss影院在线播放| 青青草中文字幕| 成人精品福利| 国产精品入口麻豆电影| 国产www视频在线观看| 四虎国产精品永久| 欧美激情福利视频在线观看免费| 狠狠干天天干| 国产福利在线视频| jizz在线视频| 中文字幕在线免费看| 91看片在线观看| a视频在线看| 成人av小说网| 亚洲网站一区| 国产亚洲精品久久久久久移动网络| 国产黄视频网站| 日本一二区视频| 中文字幕av中文字幕| 亚洲最新永久在线观看| 国产女呦网站| 国产超碰97| 超碰免费在线观看| 69国产精品视频| 黄色av网站在线免费观看| 国产传媒在线播放| 导航福利在线| jizz在线免费观看| 国产精品你懂的在线观看| 免费看的av| 亚洲成人电视网| 国产区高清在线| 国产精品亚洲色图| 开心丁香婷婷深爱五月| av丝袜在线| 在线视频三级| 国产视频精品久久| 天天操天天操一操| 国产在线观看18| 国产乱子伦三级在线播放| 日本不卡影院| www.狠狠插| 免费午夜一级| 久热中文字幕精品视频在线| 四虎www视频| 亚洲字幕成人中文在线观看| 尤物视频在线观看视频| 99reav| 亚洲精品男人| 青青久草在线| 黄色av网站在线| 久热免费在线视频| 麻豆网站在线免费观看| 狠狠综合久久久综合| 懂色一区二区三区| 国产美女在线观看| 国产香蕉视频在线看| 国产黄色在线看| 丝袜理论片在线观看| 免费av不卡在线观看| 黄色电影网站在线观看| 中文字幕一区免费| 精品无吗乱吗av国产爱色| 精品电影在线| 免费在线超碰| 最近中文字幕mv免费高清在线| 国产精品一二三区视频| 国产无遮挡又黄又爽免费网站| 国产特级淫片免费看| 一区二区三区免费视频网站| 日本三级在线视频| 国产婷婷视频在线| 亚洲欧美日韩成人网| 午夜av在线免费观看| 99久久精品免费观看国产| 人日人天天爽| 国产精品99爱免费视频| 欧美日韩国产亚洲沙发| 国产黄在线观看| 国内外激情在线| 在线视频中文字幕久| 国产女人伦码一区二区三区不卡| 国产爆初菊在线观看免费视频网站| 午夜影院免费| 在线中文资源天堂| jlzzjlzz欧美大全| 国产黄色免费| 超碰国产在线| 伊人网站在线| 中文字幕免费中文| 免费a级毛片在线播放| 在线免费观看黄色片| 国产经典av| 午夜不卡视频| 成在线人视频免费视频| 阿v免费在线观看| 国产精品㊣新片速递bt| 在线播放一区二区精品产| 国产精品黄页网站在线播放免费| 在线国产一级| 影音av资源站| 国产二区视频在线观看| 国产一卡2卡3卡四卡网站| 超碰国产在线| 免费观看久久久久| 青青草原av在线| 免费女人毛片视频| 超碰在线97国产| 国产中文字幕在线视频| 久热中文字幕在线观看| 日本高清不卡中文字幕| 色综合久久五月天| 日本天堂影院在线视频| 热99在线观看| 国产麻豆精品高清在线播放| 夜夜爽夜夜操| www.操操| 羞羞视频在线免费看| 精品伦理一区二区| 91中文字幕网| 色吊丝av中文字幕| 欧美成人久久电影香蕉| 福利视频在线看| 最新av中文字幕| 国产成人精品久久一区二区小说| 国产黄网站在线观看| 国产一级黄色大片| 国产黄色一级电影| 99在线免费观看| 青青久在线视频免费观看| 九九在线观看免费视频| 综合激情丁香| 精品176二区| 久久国产精品久久久久久小说| 国产偷窥洗澡视频| 亚洲日本一区二区三区在线观看| 国产资源在线看| 国产日产一区二区| 亚洲国产日韩在线人成电影| 高潮白浆视频| 日本综合一区二区三区| 免费在线看v| 国产精品国精产品一二| 久热免费在线视频|