(原創) 二維陣列與字串陣列有什麼差異? (C/C++) (C)
Abstract
二維陣列和字串陣列是個很類似的東西,The C Programming Language還特別提出一小節來探討,我們來看看兩者的差異在哪裡?
Introduction
在The C Programming Language 2nd 5.9節 p.113標題為Pointers vs. Multi-dimensional Arrays,特別討論二維陣列與字串陣列的差別,不過他並沒有提出實際的範例來解釋,我試著用了一個簡單的範例來探討。
C語言
2 (C) OOMusou 2008 http://oomusou.cnblogs.com
3
4 Filename : array_2_dim_vs_array_of_pointer.c
5 Compiler : Visual C++ 8.0
6 Description : Difference of 2 dim array & array of pointer
7 Release : 03/22/2008 1.0
8 */
9 #include <stdio.h>
10
11 int main() {
12 char *names1[] = {"Hello", "C"};
13 char names2[][6] = {"Hello", "C"};
14 int i = 0;
15 int j = 0;
16
17 while(i < 2)
18 printf("%s ", *(names1 + i++));
19
20 printf("\n");
21
22 while(j < 2)
23 printf("%s ", *(names2 + j++));
24
25 printf("\n");
26
27 printf("size of names1 : %d\n", sizeof(names1));
28 printf("size of names2 : %d\n", sizeof(names2));
29 }
執行結果
Hello C
size of names1 : 8
size of names2 : 12
12行
char names2[][6] = {"Hello", "C"};
names1為字串陣列,names2為二維陣列,都使用Hello與C作初始化。
17行
printf("%s ", *(names1 + i++));
while(j < 2)
printf("%s ", *(names2 + j++));
無論使用字串陣列,或使用二維陣列,都使用相同的輸出方式,而且也印出相同的結果,所以字串陣列與二維陣列真的有差異嗎?
27行
printf("size of names2 : %d\n", sizeof(names2));
當實際使用sizeof去檢視names1和names2時,names1只占8 byte,而names2卻占了12 byte,看來字串陣列和二維陣列真的不一樣!!
names1是一個字串陣列,簡單的說,它是一個一維陣列,每個元素放的是char *指標,指向字串"Hello"與"C",重點是,"Hello"與"C"這兩個字串並不存在陣列裡,而是存在記憶體的其他地方。
names2是一個二維陣列,簡單的說,字串是儲存在陣列裡,也由於他是儲存在陣列裡,所以必須考慮到最長的字串長度,雖然第二個元素"C"只有1 byte再加上'\0'共2 byte,"Hello"加上'\0'共6 byte,為了考慮最長字串6 byte,導致names的column長度要宣告到6 byte,很明顯地,這對第一個元素"C"浪費了4 byte,但字串陣列就沒這個缺點。
Conclusion
實際使用上,二維陣列和字串陣列功能一樣,不過在記憶體使用上,字串陣列較省,雖然兩者差異很小,不過還是有些差異。
Reference
Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language 2nd, Prenice Hall PTR.