你好,有人可以告訴我這是如何在c + +中可能的。這個指針數組指向什麼?
int main(){
char *names[4]= {
"Dany", "Emily", "Eric", "Alex"};
.....}
它看起來像他們正在初始化大小4和char類型的指針數組,但我不知道它的指向(char類型?4個不同的排列),如果是是這個正確的聲明,因爲我們沒有創建一個數組來存儲每個字符串中的字符? 任何解釋將不勝感激:D
你好,有人可以告訴我這是如何在c + +中可能的。這個指針數組指向什麼?
int main(){
char *names[4]= {
"Dany", "Emily", "Eric", "Alex"};
.....}
它看起來像他們正在初始化大小4和char類型的指針數組,但我不知道它的指向(char類型?4個不同的排列),如果是是這個正確的聲明,因爲我們沒有創建一個數組來存儲每個字符串中的字符? 任何解釋將不勝感激:D
雖然許多編譯器在默認情況下容忍它,因爲你有非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"
希望有所幫助。
在你的代碼片段中,你定義了一個局部數組(顯式計數爲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"};
與此相同:'char * s =「你好,棄用的世界!」;'。這在這裏已經完成了。 – juanchopanza
不是char **不是char * –
@AmithChinthaka這裏沒有'char **'。 – juanchopanza