C 速查手冊

陣列

C 語言中的陣列 (array) 為同質的資料結構 (data structure) ,這意思是說陣列中只能存放相同資料型態的資料體,每個資料體被稱為陣列的元素,宣告格式如下

datatype name[number];

宣告陣列須先指明這個陣列為何種資料型態,接著是陣列名稱,然後用中括弧圍起來的元素數量。注意,中括弧 [] 在 C 語言中為陣列專用,因此帶有中括弧的識別字名稱即為陣列,陣列宣告或定義無須特別的關鍵字 (keyword) 。

下例宣告陣列同時指派初值

#include <stdio.h>

int main(void)
{
    int a[5] = {69, 124, 25, 323, 54};
    int i;

    for (i = 0; i < 5; i++) {
        printf("a[%d] = %d\n", i, a[i]);
    }
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:a.c
    功能:示範陣列的宣告與使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc a.c
$ a.out
a[0] = 69
a[1] = 124
a[2] = 25
a[3] = 323
a[4] = 54
$

宣告及建立陣列變數的地方

int a[5] = {69, 124, 25, 323, 54};

利用大括弧圍住所有的陣列元素,同時每個元素用號分開。陣列元素也可以各自分別給值,如下

int a[5];
a[0] = 69;
a[1] = 124;
a[2] = 25;
a[3] = 323;
a[4] = 54;

其中, a[0] 中括弧內為陣列的索引,指明是第 0 個陣列元素, C 語言的陣列元素是從 0 開始索引的,因此 5 個陣列元素的索引依次為 0 1 2 3 4

如果陣列所儲存的數值是由使用者輸入,或是需要經過計算,就需要利用類似上述的方法給值。

陣列名稱也就是指標 (pointer) ,如下例改為由指標操作

#include <stdio.h>

int main(void)
{
    int a[5] = {69, 124, 25, 323, 54};
    int *iPtr = a;
    
    while (*iPtr != '\0' && *iPtr > 0) {
        printf("a-%p = %d\n", iPtr, *iPtr);
        iPtr++;
    }
   
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:arrayPtr.c
    功能:示範使用指標操作陣列
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc arrayPtr.c
$ a.out
a-0x7ffee473e830 = 69
a-0x7ffee473e834 = 124
a-0x7ffee473e838 = 25
a-0x7ffee473e83c = 323
a-0x7ffee473e840 = 54
$

宣告指標變數的地方

int *iPtr = a;

這是將陣列名稱所具有的值指派給一個指標變數,由於陣列名稱就是指標,這個運算是合法的,但是陣列名稱不能直接拿來做算術運算,所以這裡用另一個指標變數當控制變數。

再來看到 while 迴圈的條件

while (*iPtr != '\0' && *iPtr > 0) {

當陣列元素的值等於 '\0' 的時候陣列就會結束,底下的迴圈 (loop) 印出每個陣列元素的記憶體位址與所儲存的整數。

陣列也可以是多維的,這是說,陣列中也可以陣列當作元素,如下為二維陣列的例子

#include <stdio.h>

int main(void)
{
    int i , j;
    int table[10][10];
    
    for (i = 0; i < 10; i++) {
        for (j = 0; j < 10; j++) {
            table[i][j] = i * j;
        }
    }
    
    printf("3 * 3 = %2d\n", table[3][3]);
    printf("4 * 8 = %2d\n", table[4][8]);
    printf("5 * 6 = %2d\n", table[5][6]);
    printf("7 * 8 = %2d\n", table[7][8]);
    printf("9 * 2 = %2d\n", table[9][2]);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:array2d.c
    功能:示範二維陣列的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc array2d.c
$ a.out
3 * 3 =  9
4 * 8 = 32
5 * 6 = 30
7 * 8 = 56
9 * 2 = 18
$

二維陣列就需要兩層的索引,就是識別字 (identifier) 名稱後連續兩個中括弧便代表二維陣列,第一個索引表示原始陣列中的第幾個陣列,第二個索引則是該第幾個陣列中的元素項目。

字元陣列 (character array) ,也就是字串 (string) ,經常直接用指標來處理,如

#include <stdio.h>

int main(void)
{
    char *aPtr = "Time and tide wait for no man.";  
    
    while (*aPtr != '\0') {
        if (*aPtr == ' ') {
            printf("\n");
            aPtr++;
            continue;
        }
        
        if (*aPtr == '.') {
            printf("\n");
            break;
        }
        
        printf("%c", *aPtr);
        aPtr++;
    }
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:arraychar.c
    功能:示範二維陣列的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc arraychar.c
$ a.out
Time
and
tide
wait
for
no
man
$

這個程式跳過空格,一行列印一個英文單字,然後碰到句點時結束迴圈,也隨之結束程式的執行。

回 C 速查手冊首頁