2012-04-09 34 views
0

只是一個簡單的問題。有人能澄清這一個困惑我有一個C字符串,數組的指針與

我可以寫

char string[] = "Hello world"; 
char *p = string; 

printf("%s", p); 

而且它打印Hello world作爲輸出。但指針在這裏工作如何?

在陣列中的每個點有一個單獨的存儲器位置,是嗎?所以字符串數組長12個,佔用12個內存空間。我認爲一個指針只能指向一個內存位置,而不是12.指針p如何實現這一點?

正常的數組和指針,如果你想擴展你做* P ++,因爲你要通過每一個存儲位置並打印其值的數組。爲什麼你必須在那裏遍歷數組1,但這裏它只是指向整個事物?

它只是在我看來,像一個(INT數組)你遞增指針,因爲每個指針只能指向一個內存位置,但字符數組它能夠以某種方式指向所有的人。

回答

3

你說的沒錯,一個指針只能指向一個內存位置。處理數組時,指針指向第一個元素的位置。當您使用printf時,它基本上會使用指針(指向字符串的第一個元素),並打印直到到達空終止字符\0

這裏是一個指針數組VS的在C很好的解釋:

http://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

+0

同意。並且循環失敗,因爲p正在增加兩次。只加1,3和6. – danh 2012-04-09 00:24:15

+0

哦。非常感謝,沒有比這更簡單的了。我假設雖然上面的例子是使用指針打印字符串的一個無用的例子,但它也有實際用途,就像普通的帶有整數的指針一樣? – 2012-04-09 00:25:36

+0

謝謝@danh,我一看到它就發佈了,哈哈。哎呦。 – 2012-04-09 00:26:05

2

我想到了一個指針只能指向一個內存位置,而不是12如何指針p實現這一目標?

p是指向char的指針,而不是指向數組的指針。它指向string陣列的第一個元素。

現在,一個數組的值是一個指向它的第一個元素使這個聲明:如果您遞增指針

char *p = &string[0]; 

p++; 

char *p = string; 

實際上相當於

p將指向數組的下一個元件,即string[1]

+0

我明白了,我明白了!非常感謝。 – 2012-04-09 00:27:09

1

的指針數組真的是一個指向第一個地址......和printf會從直到該地址掃描發現空字符...%C和%s上的行爲有所不同

1

您使用%s,所以它打印,直到它'\0'

爲什麼是你有1有遍歷數組1,但在這裏它 僅指向整個事情?

在這裏,您使用指向char的指針,並且您想要打印字符串。所以沒關係。假設,如果你正在使用一個指向int或其他類型的指針,這將不會起作用。因此使用像p++這樣的指針運算。