2011-10-25 60 views
3

可能重複:
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"; 

+0

AFAIK在你的例子中沒有。 – Constantinius

+3

@Constantinius有一個:第一個聲明一個包含「earth」字符的新數組,而第二個是一個指向「earth」字面的指針。修改前者是合法的,修改後者是未定義的行爲。 –

+1

是的,嘗試'名稱++',你會看到不同之處。另外'sizeof(name)'。 – paxdiablo

回答

5
char namea[] = "earth"; 
char *pname = "earth"; 

一個是一個數組(該名稱namea塊的字符)。

另一個是指向單個字符的指針(名稱pname指向一個指針,它恰好指向一個字符塊的第一個字符)。

雖然前者往往會衰減到後者,但情況並非總是如此。試着對他們做一個sizeof來看看我的意思。

該數組的大小,以及該數組的大小(六個字符,包括終端空)。

指針的大小取決於指針寬度(4或8,或其他)。 pname指向的大小不是數組,而是第一個字符。因此,這將是1

您還可以移動指針的東西像pname++(除非他們宣佈不變,喜歡的東西,當然char *const pname = ...;)。您不能移動陣列名稱來指向它的第二個字符(namea++;)。

+0

'char * name =「earth」'在C++ 03中已棄用。它必須**爲const char * name =「earth」'。另外,它很容易補充說,修改一個字符串*無論如何*導致UB。 –

0

char[]描述了具有固定數量元素的char數組。

char*描述由字符的通常以空字符\0

1
  1. 炭名稱[] =「地」封端的序列的指針爲char,一般遵循的存儲器;在堆棧中創建一個可變數組,大小爲6,值爲earth \ 0
  2. char * name =「earth」;定義了一個指針,指向一個字符串值地球恆定\ 0
1
(1) char name[] = "earth"; 

name是具有內容作爲,'e''a''r''t''h'0一個字符陣列。此字符的存儲位置取決於宣佈name[]的位置(通常是堆棧或數據段)。

(2) char *name = "earth"; 

name是一個指向常量字符串的指針。 "earth"的存儲位置是只讀內存區域。

在C++中,不贊成這種方式,它應該是const char *name = "earth";

0

隨着

char *name = "earth" 

不得修改名稱的內容。

因此

name[2] = 'A'; 

字符*由 '\ 0' 字符終止而名稱[]具有固定的大小。

將導致段錯誤。

初始化變量需要巨大的性能和空間損失 爲陣列。如果您打算更改 字符串,請僅使用數組方法,但每次輸入變量的作用域時,它都會佔用堆棧中的空間,並會增加一些嚴重的開銷 。否則使用指針方法 。

相關問題