簡體   English   中英

我們可以在 C 中將 (void *)0 稱為空指針嗎?

[英]Can we call (void *)0 a void pointer in C?

總結 C 標准,特別是ISO/IEC 9899:201x §6.3.2.3 - 3

如果將指針與常量文字0進行比較,則這是檢查指針是否為空指針的檢查 這個0然后被稱為空指針常量 C 標准定義將0強制轉換為void *類型既是空指針又是空指針常量。

現在,如果我們查看(void *)0它是一個指向void的地址(在此上下文中是非法的)。

通常我們可以將這樣的地址轉換為任何適當的指針數據類型並取消引用它,但即使在將其轉換為其他指針類型之后,取消引用它也是非法的。

所以我的疑問是:

我們可以將(void *)0稱為 void 指針,看看它的定義方式嗎?

另請參閱以下代碼:

void *pointer = NULL;

我現在叫它什么? 空指針、空指針還是空指針?

我現在叫它什么? 空指針、空指針或空空指針?

在本聲明中

void *pointer = NULL;

聲明了一個void *類型的null pointer由於使用空指針常量對其進行初始化,因此該指針是空指針。

指向任何類型對象的指針都可以是空指針。

使用將零整數常量轉換為void *是因為void *類型的指針可以隱式轉換為任何其他對象指針類型。 使用類型void *另一個優點是您不能取消引用該類型的指針,因為類型void始終是不完整的類型。

C 的早期版本沒有void類型。 使用了char類型而不是void類型。 因此,例如在舊的 C 程序中,您可能會遇到以下內容

memcpy( ( char * )p1, ( char * )p2, n );

所以我的疑問是我們可以將 (void *)0 稱為空指針,看看它的定義方式嗎?

它當然是一個空指針。 聲明void *pointer表示您聲明pointer的指針無效。 pointer永遠不會是空指針。 它的類型永遠不會改變,但可以從 null 變為其他值。 此外,表達式(void *)x基本上意味着“將x轉換為 void 指針”。因此該表達式也具有指向 void 的類型指針。

我現在叫它什么? 空指針、空指針還是空指針?

我永遠不會使用短語“空指針”。 空指針是任何類型的指針,指向空。 void 指針只是一個指向 void 的指針。 將它們組合成一個短語只會讓人感到困惑。 它既是空指針又是空指針。 任何指針都可以是空指針。 考慮一下:

int *p = (void*)0;

p是空指針,但它不是空指針。

所以我的疑問是我們可以將(void*)0稱為 void 指針,看看它的定義方式嗎?

(void*)0是空指針常量而不是void指針。

強制賦值不定義變量的類型。 例如在int *ptr = (void*)0; ptrint指針,指針int ,而不管分配的,同樣的方式, void *ptr = (void*)0; 是一個void指針,指向void的指針,這兩個指針的值都是0 ,這使得它們都是空指針。

閱讀Lundin 的評論,了解有關(void*)0有趣額外信息。


 void *pointer = NULL;

我現在叫它什么? 空指針、空指針或空空指針?

null pointer是值為 0 的指針。

void pointer是具有void類型的指針。

一個null void pointer是類型的指針void和其值為0,它不是一個常規的表達而是指針是什么的描述,它的值(即,其中它指向中,如果所定義的存儲器地址)。

因此,IMO 可以將其全部稱為三個,具體取決於您要參考的內容或要求的描述。

null指針不能被取消引用為void或任何其他類型。 它的值為 0,它不指向任何有效的內存位置,這是您不能取消引用它的唯一原因。


為了完成,這些都是有效的語句,將產生相同的結果:

void *pointer = (void*)0;
void *pointer = 0;
void *pointer = NULL;

NULL可以定義為(void*)0 (空指針常量),或者只是0 (常量文字),兩者都是有效的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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