![](/img/trans.png)
[英]Invalid conversion from ‘const char*’ to ‘unsigned 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
成功而不需要演員?
首先,重要的是強調char
, signed char
和unsigned 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 char
到char
的隱式標准指針轉換。
另一方面,根據第4.7段中的規定,允許在整數類型的值之間進行轉換。
C ++沒有自動指針轉換,分配每一側的指針類型都無關緊要,如果它們不同,則需要轉換。
char
是unsigned char
和signed char
的不同類型。 它只能保證對其中一個具有等價值表示,但它仍然是一種獨特的類型。 因此,您無法將unsigned char*
或signed char*
為char*
(即,除非使用reinterpret_cast
)。 C ++只是不允許像這樣的不同類型之間的指針轉換,因為那樣一種類型可以偽裝成另一種類型。
但是,從unsigned char
或signed char
到char
的轉換完全沒問題,因為它只涉及其值的轉換。
以這種方式考慮:你可以將int
轉換為float
,但是你不能將int*
轉換為float*
。
我可能是錯的,但如上所述,當你指定“C = S; C = U;”時,C ++會自動轉換它,有點像你做“char x =”h“; printf(”%i“,x );”。 但是,指針指向內存中的特定位置,並且該位置具有大小。 因此,雖然轉換類型只是從不同的角度查看值,但指向不同的值可能涉及更改指向的值的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.