(原創) 二維陣列與字串陣列有什麼差異? (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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值