1. 程式人生 > 其它 >用多維陣列名作為指標

用多維陣列名作為指標

就像一維陣列的名字可以用作指標一樣,無論陣列的維度是多少都可以採用任意陣列的名字作為指標。但是,需要特別小心。思考下列陣列:

int a[NUM_ROWS][NUM_COLS]

a不是指向a[0][0]的指標,而是指向a[0]的指標。從C語言的觀點來看,這樣是有意義的。C語言認為a不是二維陣列而是一維陣列,且這個一維陣列的每個元素又是一位陣列。用作指標時,a的型別是int (*)[NUM_COLS](指向長度為NUM_COLS的整形陣列的指標)。

瞭解a指向的是a[0]有助於簡化處理二維陣列元素的迴圈。例如,為了把陣列a的第i列清零,可以用

for (p = &a[0]; p < &a + [NUM_ROWS]; p++)
    (*p)[i] = 0;

取代

for (p = a; p < a + NUM_ROWS; p++)
    (*p)[i] = 0;

另一種應用是巧妙地讓函式把多維陣列看成是一維陣列。例如,思考如何使用find_largest函式找到二維陣列a中的最大元素。

int find_largest(int a[], int n)
{
    int i, max;
    
    max = a[0];
    for (i = 1; i < n; i++)
        if (a[i] > max)
            max = a[i];
    return max;
}

我們把a(陣列的地址)作為find_largest

函式的第一個實際引數,NUM_ROWS * NUM_COLS(陣列a中的元素總數量)作為第二個實際引數;

largest = find_largest(a, NUM_ROWS * NUM_COLS);         // wrong

這條語句不能通過編譯,因為a的型別為int (*)[NUM_COLS]find_largest函式期望的實際引數型別是int *。正確的呼叫是:

largest = find_largest(a[0], NUM_ROWS * NUM_COLS);

a[0]指向第0行的元素0,型別為int *(編譯器轉換後),所以這一次呼叫將正確地執行。