在C中,串是一個0結尾的字符值的序列-IOW,字符串"Hello"
被表示爲字符序列'H'
,'e'
, 'l'
, 'l'
, 'o'
, 0
。字符串是存儲在char
陣列(或wchar_t
爲寬字符串):
char str[] = "Hello";
在內存方面,str
會是這個樣子:
+---+
str: |'H'| str[0]
+---+
|'e'| str[1]
+---+
|'l'| str[2]
+---+
|'l'| str[3]
+---+
|'o'| str[4]
+---+
| 0 | str[5]
+---+
它可以存儲多個字符串在單個1D陣列中,雖然幾乎沒有人這樣做:
char strs[] = "foo\0bar";
在存儲器:
+---+
strs: |'f'| strs[0]
+---+
|'o'| strs[1]
+---+
|'o'| strs[2]
+---+
| 0 | strs[3]
+---+
|'b'| strs[4]
+---+
|'a'| strs[5]
+---+
|'r'| strs[6]
+---+
| 0 | strs[7]
+---+
"foo"
存儲開始strs[0]
,而串"bar"
存儲開始strs[4]
的字符串。
通常,存儲串的陣列,你要麼使用的char
2D陣列:
char strs[][MAX_STR_LEN] = { "foo", "bar", "bletch" };
或指針的一維數組來char
:
char *strs[] = { "foo", "bar", "bletch" };
在第一種情況下,字符串的內容存儲在strs
數組中:
+---+---+---+---+---+---+---+
strs: |'f'|'o'|'o'| 0 | ? | ? | ? |
+---+---+---+---+---+---+---+
|'b'|'a'|'r'| 0 | ? | ? | ? |
+---+---+---+---+---+---+---+
|'b'|'l'|'e'|'t'|'c'|'h'| 0 |
+---+---+---+---+---+---+---+
在第二,每個strs[i]
點到一個不同的,一維數組的char
:
+---+ +---+---+---+---+
strs: | | strs[0] ------> |'f'|'o'|'o'| 0 |
+---+ +---+---+---+---+
| | strs[1] ----+
+---+ | +---+---+---+---+
| | strs[2] -+ +-> |'b'|'a'|'r'| 0 |
+---+ | +---+---+---+---+
|
| +---+---+---+---+---+---+---+
+----> |'b'|'l'|'e'|'t'|'c'|'h'| 0 |
+---+---+---+---+---+---+---+
在代碼中,a
可以(並且通常旨在)存儲單個串這是9個字符長(不包括0終止符)。就像我所說的,幾乎沒有人在單個一維數組中存儲多個字符串,但可以(在這種情況下,a
可以存儲2個4個字符的字符串)。
你認爲循環有什麼意義嗎?你一遍又一遍地覆蓋同一個位置。 –
一旦數組以空值終止,它就成爲一個字符串。對於一個未初始化的自動'char'數組,它永遠不能被稱爲一個字符串。 –
當你在調試器中觀察'a'時,你會發現什麼? – KevinDTimm