相信大家在學習c語言時,對一維陣列和指標的理解應該是自信的,但是,我在學習過程中,看到網上一些博文,發現即便是參加工作的一些專業程式設計人員,突然碰到二維陣列和指標的問題時,也可能會遇到難以處理的詭異問題,並且問題一出現,很難一時間解決。
好了,現在開始。
我對二維陣列和指標的處理劃分為兩類:降維法,線性連續法。(這僅僅是我自己命命名而已)。
1) 降維法 。
我記得在一本日本作家的書裡看到過這樣乙個理念:c語言其實沒有所謂的「二維(多維)陣列」。此說法的 依據是:拿二維陣列來說,其實就是乙個特殊的一維陣列,特殊在於它裡面的元素又是若干個陣列。若把裡面的陣列看做是乙個元素,那麼,這個陣列就是普通的一維陣列了。降維法
的思想就是如此。
如何降維?
例如:int arr[3][2]=,,}; 我們去掉arr[3],就剩下int [2],那麼int[2]就是降維後的「一維陣列」的 元素的型別,也就是說: 和 和 這3個元素的型別是int[2]型。現在,你就把這個陣列當做是一 維陣列看待吧。同樣,我們定義乙個指標去指向這個陣列,當然這個指標的型別必須要和這個「一維陣列」的 型別一致,所以,定義為:int (*p)[2] (請注意這個與int*p[2]的區別
) 。接下來就是讓指標變數p指向陣列 了,和一維陣列一模一樣, p=arr 或者 p=&arr[0]。下面我們來多陣列進行處理。
# include
int main (void)
,,};
int i,j;
int (*p)[2]=arr; //或者= &arr[0]
for(i=0;i<3;i++)
for(j=0;j<2;j++)
printf("%d\n", *(arr[i]+j) ) //或者 *(*(arr+i)+j ) ,因為arr[i]等價於*(arr+i)
return 0; }
///函式形式:
# include
void test( int (*a)[2] , int row )
int main (void)
,,};
int (*p)[2]=arr ;
//或者= &arr[0]
test(p,3); //其實也可以不用定義p指標,直接傳送arr或者&arr[0]也可以
return 0;}
// 函式形式:情景:找出乙個二維陣列每行的最大值,並輸出。
# include
void test(int (*a)[2],int row) //形參是「一維陣列的位址」和 行數。 }
int main(void)
,,,,};
int (*p)[2]=arr
//或者=&arr[0]
test(p,5);
return 0;}
線性連續法:
我們要知道:二維(多維)陣列的最基本元素在記憶體中的儲存方式是線性連續的,而不是平面的。
如上圖:定義乙個二維陣列:int a[3][4]=,,},假定2000是元素1的位址,我 們發現這個陣列的最基本元素的位址是連續的,於是我們就可以用這個屬性來處理二維陣列。
比如我們在對乙個二維陣列通過scanf函式初始化的時候(或者全部輸出),這時不會考慮二維陣列形式上的 問題(如他是幾行,幾列),我們只是把他們乙個乙個賦值而已,可以這樣。
# include
int main (void)
有人會說:這種方法不方便對二維陣列以矩陣的形式處理,請看接著看。
函式形式:情景:找出乙個二維陣列每行的最大值,並輸出。
# include
void test(int*a,int row,int col) //定義函式,形參為:整形指標,行數,列數。
} int main(void)
,,};
int *p=&arr[0][0]; //取第乙個最基本元素的位址
test(p,3,2); //傳送位址,行數 列數
return 0;
}我們會發現,線性連續法
在取陣列位址的時候很簡單粗暴,就是取陣列的第乙個最基本元素就ok了,如果想要重 新利用二維陣列的矩陣形式,這裡用了乙個小技巧,請看: *(a+i*col+j)它表示每個最基本元素 ,簡單起見,我 們把col換成眼前問題的列數2,也即是*(a+i*2+j),首先明確:括號裡面的是每個基本元素的位址,a是起始位址, 是乙個導火索,i*2 是用來讓位址「換行」的,j則是讓位址在i確定(即乙個行)的情況下遍歷這行的每個元素的地 址。請牢記:i*col, 這裡的col是列數。
寫在最後:第一次寫部落格。所以,存在錯誤也請大家諒解。希望大家踴躍提出意見。謝謝。
C語言指標與二維陣列
includeint main int p 3 null p array p is same as array,the use of p is same as array.so p is the two devision pointer same as array int p1 array 0 0 ...
C語言指標與二維陣列
二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4 5 6 7 8 9 10 11 但在記憶體中,a 的分布是一維線性的,整個陣列占用一塊連續的記憶體...
C語言指標與二維陣列
二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4 5 6 7 8 9 10 11 但在記憶體中,a 的分布是一維線性的,整個陣列占用一塊連續的記憶體...