2015-09-13 238 views
-2

你好,有人可以告訴我這是如何在c + +中可能的。這個指針數組指向什麼?

int main(){ 
    char *names[4]= { 
    "Dany", "Emily", "Eric", "Alex"}; 
    .....} 

它看起來像他們正在初始化大小4和char類型的指針數組,但我不知道它的指向(char類型?4個不同的排列),如果是是這個正確的聲明,因爲我們沒有創建一個數組來存儲每個字符串中的字符? 任何解釋將不勝感激:D

+0

與此相同:'char * s =「你好,棄用的世界!」;'。這在這裏已經完成了。 – juanchopanza

+0

不是char **不是char * –

+2

@AmithChinthaka這裏沒有'char **'。 – juanchopanza

回答

1

雖然許多編譯器在默認情況下容忍它,因爲你有非const的char指針指向常量字符數組你有一個錯誤。

您應該在數組中聲明的指針是const

int main(){ 
    const char* names[4]= { 
    "Dany", "Emily", "Eric", "Alex"}; 
} 

這將創建四個const char*(指向常量字符)的數組。

所以數組的每個元素是一個指針到字符數組:

names[0]->"Dany" 
names[1]->"Emily" 
names[2]->"Eric" 
names[3]->"Alex" 

希望有所幫助。

+0

這是否意味着我們正在爲每個名稱創建一個char數組(dany,emily ...)?然後將指針數組的每個元素指向該特定數組? –

+0

@FaresIsmail每個字符串文字(又名'「Danny」')是一個(常量)*字符數組*,編譯器會將其第一個元素('D')的*地址*賦值給相關的數組元素('names [ 0]')。 – Galik

+0

@FaresIsmail是的,你說的是正確的。每個數組元素都包含指向數組第一個元素的*地址*。 – Galik

1

在你的代碼片段中,你定義了一個局部數組(顯式計數爲4個元素),它包含指向常量字符串的指針。

讓我們來看看你的代碼的組件,如果你想要去更深一層

.LC0: 
    .string "Dany" 
.LC1: 
    .string "Emily" 
.LC2: 
    .string "Eric" 
.LC3: 
    .string "Alex" 
main: 
    push rbp 
    mov rbp, rsp 
    mov QWORD PTR [rbp-32], OFFSET FLAT:.LC0 
    mov QWORD PTR [rbp-24], OFFSET FLAT:.LC1 
    mov QWORD PTR [rbp-16], OFFSET FLAT:.LC2 
    mov QWORD PTR [rbp-8], OFFSET FLAT:.LC3 
    mov eax, 0 
    pop rbp 
    ret 

每個二進制/可執行文件在不同的細分[1]第15頁組織(使用x86 GCC 4.9.2創建) 。一部分用於全局變量,一部分用於代碼,另一部分用於只讀數據(.rodata部分),...。如您所見,程序集包含4個定義的字符串,它們位於只讀部分(請參閱標籤.LC(0-9)

僅供參考:只讀部分中的字符串文字(實際上是所有內容)都是const且必須的被宣佈爲const。試圖修改此部分導致未定義的行爲

const char* names[4]= {"Dany", "Emily", "Eric", "Alex"}; 
相關問題