可能重複:
C - Difference between 「char var[]」 and 「char *var」?
Difference between char a[]=「string」; char *p=「string」;char []和char *之間的區別?
會有人解釋究竟是什麼的char []與char *之間的區別? 例如差
和 感謝之間char name[] = "earth";
char *name = "earth";
可能重複:
C - Difference between 「char var[]」 and 「char *var」?
Difference between char a[]=「string」; char *p=「string」;char []和char *之間的區別?
會有人解釋究竟是什麼的char []與char *之間的區別? 例如差
和 感謝之間char name[] = "earth";
char *name = "earth";
char namea[] = "earth";
char *pname = "earth";
一個是一個數組(該名稱namea
指塊的字符)。
另一個是指向單個字符的指針(名稱pname
指向一個指針,它恰好指向一個字符塊的第一個字符)。
雖然前者往往會衰減到後者,但情況並非總是如此。試着對他們做一個sizeof
來看看我的意思。
該數組的大小,以及該數組的大小(六個字符,包括終端空)。
指針的大小取決於指針寬度(4或8,或其他)。 pname
指向的大小不是數組,而是第一個字符。因此,這將是1
您還可以移動指針的東西像pname++
(除非他們宣佈不變,喜歡的東西,當然char *const pname = ...;
)。您不能移動陣列名稱來指向它的第二個字符(namea++;
)。
'char * name =「earth」'在C++ 03中已棄用。它必須**爲const char * name =「earth」'。另外,它很容易補充說,修改一個字符串*無論如何*導致UB。 –
char[]
描述了具有固定數量元素的char數組。
char*
描述由字符的通常以空字符\0
(1) char name[] = "earth";
name
是具有內容作爲,'e'
,'a'
,'r'
,'t'
,'h'
,0
一個字符陣列。此字符的存儲位置取決於宣佈name[]
的位置(通常是堆棧或數據段)。
(2) char *name = "earth";
name
是一個指向常量字符串的指針。 "earth"
的存儲位置是只讀內存區域。
在C++中,不贊成這種方式,它應該是const char *name = "earth";
隨着
char *name = "earth"
不得修改名稱的內容。
因此
name[2] = 'A';
字符*由 '\ 0' 字符終止而名稱[]具有固定的大小。
將導致段錯誤。
初始化變量需要巨大的性能和空間損失 爲陣列。如果您打算更改 字符串,請僅使用數組方法,但每次輸入變量的作用域時,它都會佔用堆棧中的空間,並會增加一些嚴重的開銷 。否則使用指針方法 。
AFAIK在你的例子中沒有。 – Constantinius
@Constantinius有一個:第一個聲明一個包含「earth」字符的新數組,而第二個是一個指向「earth」字面的指針。修改前者是合法的,修改後者是未定義的行爲。 –
是的,嘗試'名稱++',你會看到不同之處。另外'sizeof(name)'。 – paxdiablo