2011-10-20 153 views
10

這是我的另一個question的延續。字符串數組初始化

考慮下面的代碼:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

它不能編譯令我驚訝(顯然我不知道C語法以及我認爲),並生成以下錯誤:

error: initializer element is not constant 

如果我改變的char *轉換成char []它編譯罰款:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

誰能給我解釋一下爲什麼?

回答

6

在第一個示例中(char *hi = "hello";),您正在創建一個非const指針,該指針被初始化爲指向靜態常量字符串「hello」。理論上這個指針可以指向任何你喜歡的東西。

在第二個示例(char hi[] = "hello";)中,您明確定義了一個數組,而不是指針,所以它引用的地址是不可修改的。請注意,數組可以被認爲是指向特定內存塊的不可修改的指針。

你的第一個例子實際上在C++(我的編譯器,至少)編譯沒有問題。

+1

謝謝。有沒有辦法使用const關鍵字來使第一段代碼工作? – lang2

+1

@ lang2不在該範圍內。看這[C常見問題](http://c-faq.com/ansi/constasconst.html)。甚至不用'char * const hi'(常量指向字符的指針)。 – cnicutar

+0

只是添加了一些東西,我不確定它是否會工作......你的第一個版本在C++中編譯好 - 我會在C編譯器的時候嘗試一下:) – icabod