首先,你需要了解如何「串」工作C.
「字符串」存儲爲字符的內存中的數組。由於沒有辦法確定字符串的長度,所以在字符串後面追加NUL字符'\0'
,以便我們知道它的結束位置。
因此,舉例來說,如果你有一個字符串「foo」,它可能看起來像這樣的記憶:
--------------------------------------------
| 'f' | 'o' | 'o' | '\0' | 'k' | 'b' | 'x' | ...
--------------------------------------------
'\0'
後的東西只是東西,恰好被放置在字符串之後,這可能是可能不會被初始化。
當你給一個類型爲char *
的變量賦值一個「字符串」時,會發生什麼變量會指向字符串的開始,所以在上面的例子中它會指向'f'
。 (換句話說,如果你有一個字符串str
,那麼str == &str[0]
總是如此。)當你給一個char *
類型的變量賦值一個字符串時,實際上是將該字符串的第零個字符的地址賦值給該變量。
當您將此變量傳遞給printf()
時,它將從指向地址開始,然後逐個遍歷每個字符,直到看到'\0'
並停止。例如,如果我們有:
char *str = "foo";
,你把它傳遞給printf()
,它將執行以下操作:
- 提領
str
(這給'f'
)
- 提領
(str+1)
(這給'o'
)
- Dereference
(str+2)
(它給出了另一個'o'
)
- 解除引用
(str+3)
(它給出'\0'
,這樣過程停止)。
這也得出結論,你目前的行爲實際上是錯誤的。在你的代碼有:
char charMemoryHolder = 'G';
myCharPointer = &charMemoryHolder;
printf("%s\n", myCharPointer);
當printf()
看到%s
符,它的推移myCharPointer
到指向的地址,在這種情況下,它包含'G'
。然後它會嘗試獲得'G'
之後的下一個字符,這是未定義的行爲。它可能時不時給你正確的結果(如果下一個內存位置碰巧包含'\0'
),但一般來說你不應該這樣做。
來源
2015-11-22 07:30:28
ace