陣列(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