2015-12-29 214 views
-5

當我們寫char *str="john"; 沒有錯誤會出來,但是當我們寫 int *ptr=50; 錯誤會出來這樣 "Invalid conversion from int to int *".C指針,指向和字符串

爲什麼這種差異? 爲什麼我們需要使用指針來存儲string s,而我們不需要(不能使用)指針來存儲int s?

+3

有什麼可說的? 50不是指針; '「約翰」是一個指針。其中一個大部分是正確的(類型應該是'const char *');另一個是不正確的。 –

+2

回答自己:'50'和''你好''有哪些類型? – Olaf

+1

'請快速回答。'..嗯..怎麼樣一個DCV呢? –

回答

0

"john"返回指向字符串常量john的第一個字母的指針。

由於char * str需要pointer to char,聲明char *str="john";不會給出任何警告。


50返回值50本身。

int * p需要一個pointer to int,但它會得到一個int50。所以它給人的警告Invalid conversion from int to int *

2

所有參考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*類型的左值對象是合法的,因爲從intint*的轉換是隱含執行的(第6.5.16.1節 ¶1),但是您的編譯器不符合標準並因某種原因拒絕。

+0

一個指針可以被轉換爲一個整數,這是隱式完成的。但是結果是實現定義的,不保證是可用的,並且在大多數情況下並非意圖使用。因此只是一個警告,而不是一個錯誤。 – Olaf

+0

詳細信息:字符串文字將被寫入內存中的字符串表,地址將返回到指針。 – ForeverStudent

+0

@FUZxxl - 6.5.16.1 1在*賦值時不允許從'int'到'int *'的隱式轉換;如果左操作數具有指針類型,則右操作數必須是指向兼容類型的*指針,指向「void」的指針或空指針常量。'int * ptr = 50;'是違反約束的。 –