用多維陣列名作為指標
阿新 • • 發佈:2022-12-02
就像一維陣列的名字可以用作指標一樣,無論陣列的維度是多少都可以採用任意陣列的名字作為指標。但是,需要特別小心。思考下列陣列:
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 *
(編譯器轉換後),所以這一次呼叫將正確地執行。