2013-05-02 159 views
3

我是C編程的新手。我對指針的混沌行爲感到困惑。特別是當涉及到字符串和數組時。指向字符串的指針

我知道,我不能寫這樣,

#include <stdio.h> 
int main() 
{ 
int *number=5; 
printf("%d",*number); 
} 

因爲顯然它會嘗試寫memory.And第5的位置,這將崩潰program.I已初始化「號」。

但是,當涉及到字符串我可以寫像,

#include <stdio.h> 
int main() 
{ 
char *name="xxxxx"; 
printf(name); 
} 

而且它也能工作。所以這意味着它隱式地初始化「名稱」指針。我也知道name = & name [0]但是我也發現了name = &的名字。怎麼會這樣? 因爲,對我來說,它看起來有兩個同名的變量。任何人都可以告訴我字符串是如何在內存中創建的嗎?(這一次我假設它創建了名稱[0] ..... name [n-1]和另一個名爲「name」的變量(一個指針)把名字的位置[0]。看起來是我錯了。)

PS: - 我的英語可能不好,如果有人可以給我一個關於上述問題的鏈接,將不勝感激。

+4

C中指針的行爲不是混沌的。它是明確的。 – 2013-05-02 08:50:26

+1

如果'name'的類型爲'char *','name'與'&name'完全不同。只有'name'是'char []',並且只有值是相同的,但不是類型時纔是如此。 'char name []'name是'char []'類型的名字,但是name的名字是'char(*)[]' – 2013-05-02 09:13:23

+0

另外,請一次提出一個問題,而不是把所有讓你困惑的問題都放在同一個題。 – 2013-05-02 09:20:11

回答

1

那是因爲你這些字符串實際上是字符數組。你如何處理char *name = "xxxxx";:你可以構造一個由6個字符組成的數組(其中5個是'x',最後一個是'\0')。 name是指向該數組的指針。

這就是C中的字符串通常是句柄的方式,你有一些字符序列,以'\0'字符結尾,告訴像printf這樣的函數在哪裏停止處理字符串。

+0

你也可以加上'printf(name)'是不好的做法 – 2013-05-02 08:57:50

1

讓我們看看這段代碼:

char *name="xxxxx"; 

這裏發生的是該字符串xxxxx分配內存和指針該內存位置,或該字符串的address傳遞給pointer變量name。或換句話說,您用該地址初始化name

而且printf()是一個可變參數函數(一個帶一個固定參數,隨後的參數的隨機數)時作爲參數傳遞。第一參數printf()是類型const char*。而字符串標識符name的表示的基地址該string.Hence你可以使用

printf(name); 

它只會輸出xxxxx

name=&name too. How can it be?暴病死,這是一個合理的問題。

讓我先用真實世界的比喻來解釋。假設你在住房社區的一排房屋中有第一棟房屋。假設它的地塊編號爲0。其他房屋都在地塊上1,2,3 ......現在假設有一個指向你的房屋 ,還有另一個指向整個住房協會的行。這兩個指針是不是有相同的地址,這將是plot 0?這是因爲一個指針表示一個單獨的內存位置。這是指針的type這裏很重要。

將這個類比帶到字符串(字符數組)中,name標識符僅表示字符串的基地址,它的第一個字符的地址(如第一個房子的地址)。它的數值與整個字符串的地址是(&name),這在我的類比中是房屋的行。但它們是不同的類型,一個是char*類型,另一個是char**類型。

+0

Downvoter,停止你的「復仇」downvoting.Show我哪裏我錯了,如果你覺得我是。 – 2013-05-02 09:11:20

+1

我沒有投票答覆你的答案。在您糾正錯誤之後,我刪除了您對哪裏出現小錯誤的意見。所以如果偶然的話,你的意思是「報復」:我不是那樣的。 – kratenko 2013-05-02 09:20:07

4

與許多編程語言一樣,C支持「文字」的概念 - 當遇到特殊語法時,會使編譯器以特殊方式創建值。

-2,例如,是整數字面值。遇到此問題時,編譯器會將其視爲類型爲int的值,其內容爲-2。 "..."是一個字符串文字 - 遇到這種情況,編譯器會在特殊的內存區域中分配新空間,並使用與您在字面值內使用的字符相對應的數據填充該空間,並在該區域末尾添加0,最後使用作爲字面表達式的結果,指向該區域的指針,類型爲char*。因此char* s = "hello"是從char*類型的任務轉換爲char*類型的變量 - 完全合法。

你潛入另一個問題 - 爲什麼a == &a[0]。這是最好的一次問一個問題,但它的要點是,a[n]是相同的*((a)+(n)),等:

&a[0] == &*(a+0) == a+0 == a 
+0

「-2」看起來像字符串:-)。也許你可以使用''。 – 2013-05-02 09:02:35

+0

@Koushik你是對的,修好了! – Oak 2013-05-02 09:04:12

+0

其實我在想如何a =&[a]? – user2247911 2013-05-02 11:58:54

2
char *name="xxxxx"; 

這在內存中創建char array(常量),它將會分配它的第一個元素的地址爲name。 char *數組名稱就像指針一樣。 &name[0]表示第一個元素的地址和name(在c中,cpp只是char *數組名稱也會爲您提供第一個元素的地址(bcos是第一個地方本身分配給name的地方))也給出了相同的結果。

符號name[i]被翻譯爲*(name+i)所以你實際上有一個基地址name添加下標。 (按指針算術計算)。 printf("%s", name)被設計爲從開始地址打印到\0(其被附加到字符串的末尾使用char* a.k.a字符串文本創建)

檢查this太。

1

Basicly當C編譯器看到的表達

char *name = "xxxxx"; 

是發生了什麼,它會說。嘿"xxxxx"這是一個常量字符串(這是一個以0字節結尾的字節數組),並將其放入生成的程序二進制文件中。然後,它會替換字符串的內存位置,有點像:

的char * name = _some_secret_name_the_compiler_only_know;

其中_some_secret_name_the_compiler_only_know是一個指向內存位置,一旦程序被執行字符串將生活。並進入解析文件。