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

來源:互聯網
上載者:User

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

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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.