簡體   English   中英

C ++中的空指針

[英]Null pointer in C++

在C ++中,我聲明一個空指針是int* p=0 ,這是否意味着零是整數指針類型的某個特殊常量,或者它是否意味着p指向地址0x0 當然, 0x0必須是C ++在分配變量/數組時從不接觸的特殊地址。

C ++標准定義整數常量0轉換為空指針。 這並不意味着空指針指向地址0x0 它只是意味着當轉換為指針時,文本“0”變為空指針。

當然,使空指針具有除0x0表示相當復雜,因此大多數編譯器只是讓0x0成為空指針地址並確保在零處分配任何內容。

請注意,使用此零轉換被視為不良樣式。 使用NULL (其定義為一個預處理宏00L ,或其他一些零積分常數),或者,如果你的編譯器足夠新的支持的話, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM