(原創) 二維陣列與字串陣列有什麼差異? (C/C++) (C)

Abstract
二維陣列和字串陣列是個很類似的東西,The C Programming Language還特別提出一小節來探討,我們來看看兩者的差異在哪裡?

Introduction
在The C Programming Language 2nd 5.9節 p.113標題為Pointers vs. Multi-dimensional Arrays,特別討論二維陣列與字串陣列的差別,不過他並沒有提出實際的範例來解釋,我試著用了一個簡單的範例來探討。

C語言

1 /* 
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
Hello C
size of names1 :
8
size of names2 :
12


12行

char *names1[] = {"Hello", "C"};
char names2[][6] = {"Hello", "C"};


names1為字串陣列,names2為二維陣列,都使用Hello與C作初始化。

17行

while(i < 2)
    printf(
"%s ", *(names1 + i++));

while(j < 2)
    printf(
"%s ", *(names2 + j++));


無論使用字串陣列,或使用二維陣列,都使用相同的輸出方式,而且也印出相同的結果,所以字串陣列與二維陣列真的有差異嗎?

27行

printf("size of names1 : %d\n", sizeof(names1));
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.

posted on 2008-03-24 00:25  真 OO无双  阅读(26223)  评论(0编辑  收藏  举报

导航