考慮該例子:
int calendar[12][31];
該語句宣告了calendar是乙個陣列,該陣列擁有12個陣列元素,其中每個元素都是乙個擁有31個整型元素的陣列(而不是反過來理解)。因此,sizeof(calendar)的值是12*31=372與sizeof(int)的乘積。如果calendar不是用於sizeof的運算元,而是用於其他的場合,那麼calendar總是被轉換為乙個指向calendar陣列的起始元素的指標。要理解上面這句話的含義,就得先理解有關指標的一些細節。
任何指標都是指向某種型別的變數。
當 int a[3];
int *p;
若 這樣寫:p = a;
就會把陣列a中下標為0的元素的位址自動賦給p。注意,這裡我們並沒有寫成
p = &a;
這種寫法在ansic中是非法的,因為&a是乙個指向陣列的指標,而p是乙個指向整型變數的指標,它們的型別不匹配。
現在繼續考慮最開始的「二維陣列」,它其實是以陣列為元素的陣列。
幾個宣告如下:
int calendar[12][31];
int *ip;
int i;
其中calendar[4]的含義是什麼? 因為calendar是乙個有著12個陣列型別元素的陣列,它的每乙個陣列型別元素又是乙個有著31個整型元素的陣列,所以calendar[4]是calendar陣列的第五個元素,是calendar陣列中12個有著31個整型元素的陣列之一。因此calendar[4]的行為也就表現為乙個有著31個整型元素的行為。例如,sizeof(calendar[4])的結果是31與sizeof(int)的乘積。又如,
p = calendar[4];
這個語句使指標p指向陣列calendar[4]中下標為0的元素。
如果calendar[4]是乙個陣列,我們當然可以通過下標的形式來指定這個陣列中的元素,就像,
i = calendar[4][7];
我們也確實可以這樣做。還是與前面類似的道理,這個語句可以寫成下面這樣而表達的意思保持不變:
i = *(calendar[4]+7);這個語句還可以表達成:
i = *(*(calendar+4)+7);
下面再看,
p = calendar;
這個語句是非法的。因為calendar是乙個二維陣列,即「陣列的陣列」,在此處的上下文中使用calendar名稱會將其轉換為乙個指向陣列的指標;而p是乙個指向整型變數的指標,這個語句試圖將一種型別的指標賦值給另一種型別的指標,所以這是非法的。
很顯然 我們需要一種宣告指向陣列的指標的方法:
int (*ap)[31];
這個語句實際上是宣告了*ap是乙個擁有31個整形元素的陣列,因此ap就是乙個指向這樣的陣列的指標。因而,我們這樣寫,
int calendar[12][31];
int (*monthp)[31];
monthp = calendar;
這樣,monthp 將指向calendar的第乙個元素,即陣列calendar的12個有著31個元素的陣列型別元素之一。
假定在新的一年開始時,我們清空calendar陣列,用下標形式可以輕易做到, int month;
for(month = 0;month < 12 ;month++){ int day;
for(day = 0;day <31;day ++)
calendar[month][day] = 0;
上面的**用指標如何表示呢?
calendar[month][day] = 0;
表示為*(*(calendar+month)+day)= 0;
但是真正有關的部分是哪一部分呢?
如果monthp指向乙個擁有31個整型的陣列,而calendar的元素也是擁有乙個31個整型的陣列,因此我們可以使用乙個指標
來遍歷乙個陣列一樣,這裡我們同樣可以使用指標monthp以步進的方式來遍歷陣列calendar:
int (*monthp)[31];
for(monthp = calendar;monthp < &calendar[12;monthp++]) /*處理乙個月的情況*/
同樣地,我們可以處理其他陣列一樣,處理指標monthp所指向的陣列的元素:
int (*monthp)[31];
for(monthp = calendar; monthp < &calendar[12]; monthp ++){
int *dayp;
for(dayp = *monthp;dayp<&(*monthp)[31];dayp++)
*dayp = 0;
C語言之指標與陣列
前言 訪問陣列元素既可以使用陣列名加下標的方法,也可以使用指標的方法。但使用指標的方法可以使 更緊湊 更靈活 更高效。一 幾個概念而陣列名代表陣列的起始位址,即陣列的指標。說明 二 指標訪問一維陣列 1 利用指標名構造指標表示式 例如 定義整型陣列a,int a 6 2 利用指標變數訪問陣列 三 指...
C語言之辨別指標陣列與陣列指標
我們先來說一下指標陣列,顧名思義,這是乙個存放指標型別的陣列 從定義上來看 int p 3 沒有括號括起來它還是陣列這裡我還是寫乙個程式來理解一下 include intmain for int i 0 i 3 i return0 程式執行的結果 1 23指向指標的陣列 又稱行指標 如何定義 int...
了解C語言之指標與陣列
一 陣列的儲存與訪問 小結 a i 的內容是 a i a i 二 指向一維陣列的指標需要定義乙個基型別與陣列元素資料型別相同的指標變數。include define n 10 void main p,i p a a a i b p i c a p a d a i 2 設變數定義為 int a 4 p...