關於c語言二維陣列與指標的個人理解及處理辦法。

2021-06-28 17:39:27 字數 2541 閱讀 8921

相信大家在學習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 的分布是一維線性的,整個陣列占用一塊連續的記憶體...