簡體   English   中英

為什么我可以將 char* 隱式轉換為 const char* 而不是 unsigned char*

[英]Why can I implicitly convert char* to const char* but not unsigned char*

以下代碼片段會產生編譯錯誤:

char a = 'a';
const char* a_ = &a;
unsigned char b = 'b';
const char* b_ = &b;

最后一行產生錯誤:

error: invalid conversion from 'unsigned char*' to 'const char*'

我可以從char*隱式轉換為const char* ,但我不能對unsigned char*做同樣的事情? 這背后的原因是什么?

您可以向指針對象添加常量性。 這是允許的,因為它有用且安全。

但是你不能只是隨機地改變指針的類型。

你是說“我有一個指向char的指針,嘿,在這里,哎呀,它是一個unsigned char ”,如果沒有 C 風格的“強制”強制轉換或reinterpret_cast ,你就無法做到這一點。

這是正確的代碼:

char a = 'a';
const char* a_ = &a;
unsigned char b = 'b';
const unsigned char* b_ = &b;   // (added "unsigned" here)

因為當你將一個值存儲到一個有signed char x; 然后通過有signed char *xp = &x;獲取它 (通過*xp )或有signed char const *xcp =&x; ,你得到相同的值。 總是。

但是如果你已經signed char x = -1; 然后你通過一個unsigned char*指針獲取它,你會得到一個不同的值(255,除非是異國架構)。

這就是為什么可以將INT *ip分配給INT const *而不能分配給UINT * (其中INTUINT是任何有符號整數類型及其無符號對應物)。

嚴格的別名規則仍然允許您通過UINT指針訪問INT值,反之亦然,但您需要顯式轉換才能獲得這樣的指針(指向原始類型的不同簽名版本)。


注意: char具有未指定的符號。 它要么等signed char或類似的unsigned char ,但它是一種從兩者的這些不同(不同於所有其他整數類型,其中signed INT是相同的INT (在位域除外))。

指向非常量對象的指針可以隱式轉換為指向相同類型的常量對象的指針。 所以這些聲明

char a = 'a';
const char* a_ = &a;

是有效的。

現在讓我們考慮以下聲明(為清楚起見,移除了限定符const

unsigned char b = 'b';
char* b_ = &b;

右側的表達式具有unsigned char *類型,而初始化對象具有char *類型。 這兩種類型是不同的,並且沒有從一種類型到另一種類型的隱式轉換。 相反,你可以寫

unsigned char b = 'b';
char* b_ = reinterpret_cast<char *>( &b );

在這種情況下,右側和左側的兩個實體具有相同的類型。 因此,您現在可以為聲明的對象的規范添加限定符 const

unsigned char b = 'b';
const char* b_ = reinterpret_cast<char *>( &b );

在 C 和 C++ 中, charsigned charunsigned char類型是三種不同的類型。 類型char可以表現為有signed char類型或unsigned char類型(可以具有相同的值范圍),但這不會使其成為有符號或無符號字符。

暫無
暫無

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

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