[英]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;
, ptr
為int
指針,即指針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.