2012-06-08 66 views
0

可能重複:
What is the difference between char s[] and char *s in C?ÇStrings.what確實在C字符串返回

char *p="Help" 
printf("%ud",p); 

我得到 「幫助」 的基址,這意味着output.Does一個字符串(「幫助」)總是返回它的基地址。如果是這樣的話,這與C++的情況是一樣的。

也可以解釋下面究竟發生了什麼。

char name[]="Hello"; 

我知道這很愚蠢,但我的大腦並不安寧。

+0

此外,使用'%u'格式說明符打印指針是UB,對於(對象)指針,使用'%p'並將其轉換爲'void *'。 –

+0

@OliCharlesworth正是我在找什麼..bulls眼睛.... Thankyou :) – tez

回答

1

在您在您的文章給出了第一個例子,你用的是指針它指向存儲字符的內存地址。這就是爲什麼當你打印p時你會得到一個地址。

在第二個示例中,您將創建一個字符數組,每個字母都以「Hello」存儲。一個數組使用一些類似的內存訪問原則,因爲每個字符都存儲在連續的內存位置,所以name []是一個內存位置,然後您訪問的任何索引都是內存中第一個元素所在的第一個指針名稱[]的偏移量。

爲簡單起見,說出名稱[0] = 0x00,名稱[1] = 0x01,名稱[2] = 0x02等等。現在,每個存儲單元都保存一個代表字符串「Hello」的部分值。在訪問時,已知名稱[x]是由哪個索引訪問的,並根據訪問該元素的方式獲取該內存位置或字符。

+0

Yeahhh明白了... Thankyou :) – tez

0

如果你想打印字符串做到這一點:

char *p="Help" 
printf("%s",p); 

char name[]="Hello"; 

聲明name作爲char數組並初始化它包含字符"Hello"(5個ASCII終止字符與0NULL)。

+1

有一個重要的區別,'name'可以修改,'name [1] ='c';'沒問題,但試着修改字符串'p'指向未定義的行爲。 –

+0

@Daniel yep,真的。對不起,我會編輯答案。 – piokuc

0

C中的字符串是內存中的charaters數組(以空字符結尾)。在你的例子中,變量p是一個指向該內存地址的指針,這就是你打印的內容。

第二個例子是一樣的,除了你在棧上聲明數組(而不是編譯器的選擇)。

的主要區別在於,使用陣列([])表示法,可以容易地計算所述陣列的尺寸(以及因此的字符串),但使用的指針符號你需要遍歷陣列找到端計算尺寸。

正是在C++相似,但你最好使用std::string類型,允許你動態內存管理(如連接字符串時)

0

當您在printf中使用%u時,它始終打印任何變量的值。你使用字符串作爲變量。在字符串中,第一個字符的地址和字符串的基地址是相同的。因此它總是顯示字符串的基地址。例如,

char *p="Help"; 
printf("%u",p); 

將總是DISPLY基地址。

關於你的第二個問題,你必須知道隱式和顯式初始化的概念。 手動給出字符數組的大小時,它被稱爲顯式初始化。 例如char str[10]="abcdef";

而在其他情況下,如char str[]="abcd";,它隱含地將字符串長度作爲字符數組的大小(在本例中爲4,從0開始到3,結束爲空字符'\ 0')。 我希望你明白這一點。