[C 語言] 程式設計教學:如何使用陣列(Array) | 開源技術教學網
文章推薦指數: 80 %
在C 語言中,陣列是唯一的內建資料結構,其他的動態資料結構需自行實作。
本文介紹陣列的使用方式。
宣告陣列. 以下敘述建立一個長度為 5 、元素型別為 int 的 ...
Togglenavigation開源教學精選項目C語言Golang資料結構網頁程式電子書籍現代C語言程式設計C語言應用程式設計多平台Objective-C程式設計跨平台CommonLisp程式設計社群媒體臉書粉絲團臉書社團推特GitHubGumroad本站資訊關於著作權免責聲明隱私權開源教學C程式設計如何使用陣列(Array)最後修改日期為JUL19,2018前言陣列是線性且同質的資料結構,使用零或正整數為索引來存取其中元素。
在C語言中,陣列是唯一的內建資料結構,其他的動態資料結構需自行實作。
本文介紹陣列的使用方式。
宣告陣列以下敘述建立一個長度為5、元素型別為int的陣列arr:intarr[5];
要注意這時候陣列元素尚未初始化。
陣列未初始化時所存的值視為垃圾值,其運算結果不可靠。
我們也可以在宣告陣列時一併賦值:intarr[5]={3,4,5,6,7};
或者是用稍微取巧的方式來初始化:intarr[]={3,4,5,6,7};
這時候陣列arr的長度由賦值自動決定,在本範例敘述中即為5。
如果想要明確地列出陣列元素所在的位置,可以用下列方式來宣告陣列:intarr[]={
[0]=3,
[1]=4,
[2]=5,
[3]=6,
[4]=7,
};
這樣寫程式碼會變長,好處是可明確看出每個元素所在的位置。
但要注意陣列的長度不能由變數決定:intmain(void)
{
unsignedsz=5;
//Error.
intarr[sz]={1,2,3,4,5};
return0;
}
因為陣列的長度要在編譯期就決定好。
如果想要在執行期動態生成陣列,要用動態配置記憶體的方式。
我們後文會談如何動態配置陣列。
存取陣列元素陣列使用零或正整數存取陣列元素。
參考以下範例:#include
然後在第5行至第7行間分別對其中元素以索引取值。
利用斷言確認取出的值是正確的。
注意取索引時,第一個元素的索引值從0開始,而非1,這是因為索引是一種偏移值(offset)的概念。
但C語言不會檢查索引是否逾越陣列的邊界。
參考以下反例:#include
這時候取出的值是垃圾值,其運算結果不可靠。
由於逾越邊界(outofbound)算是常見的錯誤,資訊界出現過數個C方言(Cdialect),意圖改善C常見的錯誤。
其中一個例子是微軟的研究項目CheckedC。
但這些C方言,除了展示一些對C語言的想法外,幾乎沒用程式人將其在實務上。
如果讀者真的很在意陣列邊界的問題,現階段的方式就是自行實作工具函式或陣列物件,在這些自製函式或物件中加入邊界檢查的功能。
走訪陣列走訪陣列元素的方式是使用for迴圈搭配計數器(counter)。
參考下例:#include
取得陣列大小的方式請看下一節。
計算陣列大小C陣列本身沒有儲存陣列大小的資訊。
如果想要知道陣列的大小,得自行計算。
參考下例:#include
在本例中其值為5。
但這個方式只對自動配置記憶體的陣列有效,若陣列使用動態配置記憶體,則無法使用這個方法。
如果我們想儲存陣列長度的資訊,需將長度存在另一個變數中。
由於陣列和陣列長度兩者是連動的,我們會用結構體把兩個變數包在一起。
例如,以下結構體宣告一個動態陣列:structarray_t{
size_tsize;
size_tcapacity;
int*elems;
};
我們會在後文介紹結構體。
至於實作動態陣列的方式,則需參考資料結構方面的教材。
筆者也有寫關於動態陣列的文章,有興趣的讀者可以看一下。
動態配置的陣列我們先前的範例中,陣列使用自動配置記憶體。
但我們若要在執行期動態生成陣列,則要改用動態配置記憶體的方式。
我們同樣用malloc()函式來配置記憶體。
參考以下敘述:int*arr=(int*)malloc(sz*sizeof(int));
我們以sizeof求得單一元素的大小後,乘上陣列的長度sz即可配置一塊足夠大小的記憶體,用來儲存陣列arr的元素。
由此可知,陣列在電腦中以是一整塊連續的記憶體來儲存,所以可以用索引值快速存取。
如果想要在配置記憶體時一併將元素初始化為0,改用calloc()函式即可。
但calloc()函式的參數略有不同:int*arr=(int*)calloc(sz,sizeof(int));
由於多了初始化的動作,calloc()函式會比malloc()函式慢一點點。
使用完後同樣要釋放記憶體:free(arr);
由於陣列內部是單一且連續的記憶體區塊,所以可在單一free()函式呼叫中釋放掉。
不論使用malloc()或calloc(),皆使用free()來釋放記憶體。
我們來看一個動態配置記憶體陣列的範例:#include
那如果我們要動態配置記憶體呢?這時候有兩種策略,其中一種較直觀的策略是動態配置陣列的陣列。
參考以下範例:#include
延伸文章資訊
- 1C 速查手冊- 陣列 - 程式語言教學誌
C 語言中的陣列(array) 為同質的資料結構(data structure) ,這意思是說陣列中只能存放相同資料型態的資料體,每個資料體被稱為陣列的元素,宣告格式如下.
- 2【C language part 4】陣列與字串&函式 - iT 邦幫忙
陣列陣列是一群具有相同名稱或資料型態的變數集合。 由於整個陣列中的變數均具有相同的名稱,因此若要存取陣列中的變數,我們只需要透過陣列的index ...
- 3C陣列
無論是幾維的陣列,C語言都以分配一塊連續的記憶體空間來處理。 int x[10];. 分配10*sizeof(int)個bytes int x[5][10];. 分配5* ...
- 4C語言筆記— 陣列(Array). 本章重點 - Sharon Peng
我們也可以預先在陣列裡面設定好數值,只要用一個{}就可以了。以下為範例:. int candy[5] = {1, 2, 3, 4, 5};. char ch[5] = {'a', 'b', 'c...
- 5一維陣列
當然不會這麼麻煩的,C 提供陣列(Array),可以宣告一個以索引(index)作為識別的 ... int number[10]; // 宣告10 個元素的整數陣列 double score[1...