[英]Null pointer in C++
在C ++中,我聲明一個空指針是int* p=0
,這是否意味着零是整數指針類型的某個特殊常量,或者它是否意味着p
指向地址0x0
? 當然, 0x0
必須是C ++在分配變量/數組時從不接觸的特殊地址。
C ++標准定義整數常量0轉換為空指針。 這並不意味着空指針指向地址0x0 。 它只是意味着當轉換為指針時,文本“0”變為空指針。
當然,使空指針具有除0x0
表示相當復雜,因此大多數編譯器只是讓0x0
成為空指針地址並確保在零處分配任何內容。
請注意,使用此零轉換被視為不良樣式。 使用NULL
(其定義為一個預處理宏0
, 0L
,或其他一些零積分常數),或者,如果你的編譯器足夠新的支持的話, nullptr
。
這意味着零值的整數常量表達式在C ++中具有特殊含義; 它被稱為空指針常量 。 當您使用這樣的表達式初始化指針或指定指針時,實現確保指針包含適當類型的空指針值 。 這保證與指向真實對象的任何指針的值不同。 它可能有也可能沒有“零”的表示。
ISO / IEC 14882:2011 4.10 [conv.ptr] / 1:
空指針常量是整數類型的整數常量表達式(5.19)prvalue,其計算結果為零或類型為
std::nullptr_t
。 空指針常量可以轉換為指針類型; 結果是該類型的空指針值 ,並且可以與對象指針或函數指針類型的每個其他值區分開。
它是一個特殊值,保證標准永遠不會等於指向對象或函數的指針。 address-of運算符&
永遠不會產生空指針,也不會產生任何成功的動態內存分配。 您不應將其視為地址0,而應將其視為指示指針無處指向的特殊值。 為此目的有一個宏NULL
,新的習慣用法是nullptr
。
這意味着它沒有指向任何東西。
指針的值只是0.它並不一定意味着它指向地址0x0。 NULL
宏,只是一個0常量。
指針指向地址0.在大多數非常特殊的平台上,你應該使用NULL
,因為它不總是0
(但很常見)。
是。 零是一個特殊常數。 實際上,它是唯一可以在這些語句中使用的整數常量,而不使用顯式強制轉換:
int *pi = 0; //ok
char *pc = 0; //ok
void *pv = 0; //ok
A *pa = 0; //ok
一切都會編譯好。
但是,如果您使用此代碼:
int *pi = 1; //error
char *pc = 2; //error
void *pv = 3; //error
A *pa = 4; //error
所有都會給出編譯錯誤。
在C ++ 11中,當你的意思是空指針時,你應該使用nullptr
而不是0
。
在您的示例中,'p'是int的地址。 通過將p設置為0,你會說地址為0的int。 約定是0是“不是有效的地址”,但它只是一個約定。
在pratice中,地址0通常是“未映射”(即沒有內存支持該地址),因此您將在該地址處出錯。 但是,在某些嵌入式系統中並非如此。
你也可以選擇任何隨機地址(例如0xffff7777或任何其他值)作為“空”地址,但你會違反常規並混淆許多閱讀你代碼的人。 通常使用零,因為大多數語言都支持有效測試零 - 非零。
請參閱此相關問題: 為什么地址零用於空指針?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.