當我們寫char *str="john";
沒有錯誤會出來,但是當我們寫 int *ptr=50;
錯誤會出來這樣 "Invalid conversion from int to int *".
C指針,指向和字符串
爲什麼這種差異? 爲什麼我們需要使用指針來存儲string
s,而我們不需要(不能使用)指針來存儲int
s?
當我們寫char *str="john";
沒有錯誤會出來,但是當我們寫 int *ptr=50;
錯誤會出來這樣 "Invalid conversion from int to int *".
C指針,指向和字符串
爲什麼這種差異? 爲什麼我們需要使用指針來存儲string
s,而我們不需要(不能使用)指針來存儲int
s?
"john"
返回指向字符串常量john
的第一個字母的指針。
由於char * str
需要pointer to char
,聲明char *str="john";
不會給出任何警告。
但50
返回值50
本身。
int * p
需要一個pointer to int
,但它會得到一個int
50
。所以它給人的警告Invalid conversion from int to int *
所有參考ISO 9899:2011「C11」
類型的字符串字面像"john"
的是char[N]
其中N
是字符串的長度(§6.4.5 ¶ 6)。在幾乎所有上下文中,數組類型的對象都隱式轉換爲指向其第一個元素的指針,在本例中爲char*
(第6.3.2.1節)。將char*
類型的對象指定給char*
類型的左值是合法的(第6.5.16.1節 ¶¶1)。
像50
這樣的足夠小的整數文字的類型是int
(§6.4.4.1 ¶¶5)。 int
類型的對象指定爲int*
類型的左值對象是合法的,因爲從int
到int*
的轉換是隱含執行的(第6.5.16.1節 ¶1),但是您的編譯器不符合標準並因某種原因拒絕。
一個指針可以被轉換爲一個整數,這是隱式完成的。但是結果是實現定義的,不保證是可用的,並且在大多數情況下並非意圖使用。因此只是一個警告,而不是一個錯誤。 – Olaf
詳細信息:字符串文字將被寫入內存中的字符串表,地址將返回到指針。 – ForeverStudent
@FUZxxl - 6.5.16.1 1在*賦值時不允許從'int'到'int *'的隱式轉換;如果左操作數具有指針類型,則右操作數必須是指向兼容類型的*指針,指向「void」的指針或空指針常量。'int * ptr = 50;'是違反約束的。 –
有什麼可說的? 50不是指針; '「約翰」是一個指針。其中一個大部分是正確的(類型應該是'const char *');另一個是不正確的。 –
回答自己:'50'和''你好''有哪些類型? – Olaf
'請快速回答。'..嗯..怎麼樣一個DCV呢? –