簡體   English   中英

從unsigned char *到char *的轉換無效

[英]Invalid conversion from unsigned char* to char*

這是一個代碼 -

  1 int main(int argc, char *argv[])
  2 {
  3     signed char S, *psc;
  4     unsigned char U,  *pusc;
  5     char C, *pc;
  6 
  7     C = S;
  8     C = U;
  9 
 10     pc = psc;
 11     pc = pusc;
 12 
 13     return 0;
 14 }

$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]

這是在英特爾32位機器上的Ubuntu 12.10上的gcc版本4.6.3上編譯的。

考慮到char類型是x86上的unsigned char -

如果非指針類型的第7行和第8行的賦值為Ok,為什么第10行和第11行的指針類型會拋出錯誤?

此外,如果C = U成功而不需要演員?

首先,重要的是強調charsigned charunsigned char都是不同的類型 C ++ 11 Standard的4.10節定義了不同類型的指針之間的三種可能的標准指針轉換:

1。 空指針常量是整數類型的整數常量表達式(5.19)prvalue,其計算結果為零或類型為std :: nullptr_t的prvalue。 空指針常量可以轉換為指針類型; 結果是該類型的空指針值,並且可以與對象指針或函數指針類型的每個其他值區分開。 這種轉換稱為空指針轉換。 相同類型的兩個空指針值應相等。 將空指針常量轉換為指向cv限定類型的指針是單個轉換,而不是指針轉換的序列,后跟限定轉換(4.4)。 可以將整數類型的空指針常量轉換為std :: nullptr_t類型的prvalue。 [注意:生成的prvalue不是空指針值。 - 尾注]

這是不相關的,因為我們這里沒有nulltptr_t類型的空指針。

2。 類型為“指向cv T的指針”的prvalue,其中T是對象類型,可以轉換為類型為“指向cv void的指針”的prvalue。 將“指向cv T的指針”轉換為“指向cv void的指針”的結果指向T類型的對象所在的存儲位置的開始,就好像該對象是類型T的最派生對象(1.8) (即,不是基類子對象)。 空指針值將轉換為目標類型的空指針值。

這不適用,因為目標類型不是void 最后,

3。 類型為“指向cv D的指針”的prvalue,其中D是類類型,可以轉換為類型為“指向cv B的指針”的prvalue,其中B是D的基類(子句10)。如果B是D不可訪問(第11條)或模糊(10.2)基類,需要這種轉換的程序是不正確的。 轉換的結果是指向派生類對象的基類子對象的指針。 空指針值將轉換為目標類型的空指針值。

signed char不是一個基類的char ,所以也不適用。

因此,無法執行從signed charchar的隱式標准指針轉換。

另一方面,根據第4.7段中的規定,允許在整數類型的值之間進行轉換。

C ++沒有自動指針轉換,分配每一側的指針類型都無關緊要,如果它們不同,則需要轉換。

charunsigned charsigned char的不同類型。 它只能保證對其中一個具有等價值表示,但它仍然是一種獨特的類型。 因此,您無法將unsigned char*signed char*char* (即,除非使用reinterpret_cast )。 C ++只是不允許像這樣的不同類型之間的指針轉換,因為那樣一種類型可以偽裝成另一種類型。

但是,從unsigned charsigned charchar的轉換完全沒問題,因為它只涉及其值的轉換。

以這種方式考慮:你可以將int轉換為float ,但是你不能將int*轉換為float*

我可能是錯的,但如上所述,當你指定“C = S; C = U;”時,C ++會自動轉換它,有點像你做“char x =”h“; printf(”%i“,x );”。 但是,指針指向內存中的特定位置,並且該位置具有大小。 因此,雖然轉換類型只是從不同的角度查看值,但指向不同的值可能涉及更改指向的值的大小。

暫無
暫無

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

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