如果我做這樣的事情:字符串文字是否在C編譯時自動被轉換爲char *?
printf("The string is: %s\n", (unsigned char*) "string1");
或者相似:
printf("The string is: %s\n", "string1");
爲以下在編譯時做了什麼?
如果我做這樣的事情:字符串文字是否在C編譯時自動被轉換爲char *?
printf("The string is: %s\n", (unsigned char*) "string1");
或者相似:
printf("The string is: %s\n", "string1");
爲以下在編譯時做了什麼?
它是由標準定義的字符串文字的類型是char
和數組的數組自動衰減到指針,即char*
。當使用%s
說明符時,您不需要明確地將其作爲參數傳遞給printf
。
附註:在C++中它是const char*
。
[1] C99 6.4.5:「字符串文字是封閉在 雙引號的零個或多個多字節字符的序列,如在‘XYZ’... 陣列靜態存儲持續時間和長度的只是 SUF音響cient到包含序列。對於字符串文字,陣列元素具有 類型char
「
[2] C++ 03 2.1 3.4§1:「普通字符串文字具有類型爲‘n const char
’和靜態存儲持續時間」的陣列
你的理解是或多或少正確的,雖然該機制是不同的。
除了當它是sizeof
或一元&
運營商的操作數,或是一個字符串被用來初始化一個聲明另一個數組,類型「的T
N元件陣列」的表達將被轉換(」衰減「)轉換爲類型爲」指向T
的指針「的表達式,表達式的值將是數組中第一個元素的地址。所有數組類型都是如此,而不僅僅是字符串文字。
表達式"string1"
具有類型「8元件陣列char
」;在printf
中調用它不是sizeof
或一元&
運算符的操作數,也不用於初始化另一個數組,因此它被隱含地轉換爲類型爲「指向char
」的表達式其值爲地址的第一個字符。
const char
的數組,因此表達式會衰減爲輸入const char *
。
我明白了。這只是我知道必須發生的事情,但對於它的實施情況很好奇; typedef是有道理的。 – sherrellbc
我看到你要添加一個來自C標準的引用,但它不是'const char *'C下的。 –
@PaulGriffiths:是的,謝謝。我已經編輯它:) – LihO