陣列(3/22)
C語言的陣列使用與Java有著本質上的差別,因此在使用時必須特別小心。
由於兩個語言設計上的考量,使用了不同的記憶體分配機制,讓我們先了解一些基本理論後再學習如何在C語言使用指標。
編譯時期 v.s 執行時期
- 編譯時期即代表程式(原始碼)在編譯器編譯的這一段時間
- 執行時期則是指程式已經被編譯成二進位可執行檔,並載入作業系統中
靜態記憶體配置 v.s 動態記憶體配置
變數及陣列是程式為了在電腦中儲存特定資料而生功能。不過程式到底是什麼時候宣告的變數、陣列,並且實際佔用了某塊記憶體空間呢?
實際上,記憶體的配置(宣告變數、陣列),有兩種方式可以達成,分別是靜態記憶體配置及動態記憶體配置。
靜態記憶體配置如C語言的宣告變數功能,是在程式編譯的時候,就已經決定好要將變數分配到哪個記憶體空間上,而程式將佔用此記憶體空間直到程式執行結束,而由於空間已經於編譯時決定好,程式無法在執行時期改變其大小。
動態記憶體配置,如Java或C++的new功能,是一種屬於動態記憶體配置的功能(C語言中屬於進階技巧,日後在進行介紹),程式可以在執行時期才決定要分配多少空間,具有更大的彈性。
不過!看完以後,不要認為動態記憶體分配就有絕對的優勢,事實上該用哪一種方式宣告變數或記憶體,需要視情況而定,我們將在後續章節繼續討論。
C語言陣列範例
array.c
#include <stdio.h>
/* Please pratice your English :) */
int main(void)
{
int array1[5] = {0}; //All initialize to 0
int array2[5]; //Not initialized yet
int array3[5] = {1, 2, 3, 4, 5}; //Initialize all terms by assinging the value
printf("First term of the array 1 = %d\n", array1[0]); //Fist term is 0
printf("Last term of the array 1 = %d\n", array1[4]); //Not array[5], count from 0 to 4!
/* Use sizeof opeartor to calculate the array size */
int array_size = sizeof(array1) / sizeof(array1[0]); //The whole array divided by a single term is equal to the size
int i; //C89 for loop
for(i = 0; i < array_size; i++) {
printf("array3[%d] = %d\n", i, array3[i]); //print every term
}
return 0;
}
執行:
gcc array.c
./a.out
結果
First term of the array 1 = 0
Last term of the array 1 = 0
array3[0] = 1
array3[1] = 2
array3[2] = 3
array3[3] = 4
array3[4] = 5