RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [C&C++] [分享]C語言多維陣列傳輸至副程式的方法   字型大小:||| 
Adsmt
金驢友〔初級〕
等級: 16等級: 16等級: 16等級: 16
大頭大頭,寒流不愁。你有綿被,我有毛頭。

 . 積分: 2152
 . 文章: 2920
 . 收花: 19913 支
 . 送花: 21590 支
 . 比例: 1.08
 . 在線: 4458 小時
 . 瀏覽: 34203 頁
 . 註冊: 6924
 . 失蹤: 8
#1 : 2010-1-27 11:40 AM     全部回覆 引言回覆

還有 array pointers 和 pointers to array

array pointers, 這是比較常用的方法:

char *ar[10];

for( i = 1; i <= 10; i++)
  ar[i-1] = (char *)malloc(sizeof(char)*i);

一個「陣列指標」的蓋念,就是由指標構成的陣列,所以每一個指標都可以指向一個「不等長度」的記憶體區段,這在使用上會比宣告固定的二維陣列靈活得多。

pointers to arrays 就是相反的概念了:
  int (*abc)[10];

  abc = (int (*)[])malloc(sizeof(int) * 5 * 10);

陣列的元素長度固定,但陣列數量不固定。

這兩個的差別,如果以中文來說的話,前者就是「指標的陣列」;後者則為「指向陣列群的指標群」。
舉例來說,前者相當於去訂做箱子,老闆叫你去訂做十個,但大小由你決定,每個箱子可以完全不同。
後者則是你去買箱子,老闆說他只剩下一種箱子,但數量很多,因此他問你需要多少個。

[Adsmt 在  2010-1-27 11:42 AM 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Adsmt
金驢友〔初級〕
等級: 16等級: 16等級: 16等級: 16
大頭大頭,寒流不愁。你有綿被,我有毛頭。

 . 積分: 2152
 . 文章: 2920
 . 收花: 19913 支
 . 送花: 21590 支
 . 比例: 1.08
 . 在線: 4458 小時
 . 瀏覽: 34203 頁
 . 註冊: 6924
 . 失蹤: 8
#2 : 2010-1-27 11:54 AM     全部回覆 引言回覆

嚴格來說,陣列並不等於指標。

最簡單的例子:

char ar[10], *br;

br = ar;

printf("ar_addr=%p, br_addr=%p\n", ar, br);
printf("ar_addr=%p, br_addr=%p\n", &ar, &br);

這個程式印出很有趣的結果:
ar_addr=0xbfeedd92, br_addr=0xbfeedd92
ar_addr=0xbfeedd92, br_addr=0xbfeedd8c

我們可以看到指標 br 在 0xbfeedd8c 這個記憶體位置儲存了 0xbfeedd92 這個值。
但陣列 ar_addr 就有趣了,他是在0xbfeedd92這個記憶體位置儲存了 0xbfeedd92 這個值。
對系統而言,陣列是一個可用的記憶體區塊,而不是一個指標。如果你看他的 assembly code 就會發現兩者的不同。

不過在實際運用上大致是差不多。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-4-27 04:39 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.019299 second(s), 7 queries , Qzip disabled