先說在前面,一般的我們說的c/c++中的二維陣列是定義在棧中的二維陣列。比如定義了乙個array[3][4],那就指的是定義了乙個三行四列的矩陣形狀的二維陣列,如下圖所示。這樣的矩陣在記憶體中是以箭頭右邊的方式存放的,也就是說實際上我們定義的二維陣列在記憶體中仍然像是一維陣列那樣連續儲存的。可以想象為把乙個矩陣一層層伸展鋪平。
因此可以使用如下方法定義二維陣列:
/* 可以使用下面的方法來初始化二維陣列
* 也就是直接將二維陣列鋪平,寫成一維陣列的形式
*/int array[3][4] = ;
/* 可以使用標準的二維陣列的初始化方式
*/int array[3][4] = , , };
下面的一種寫法本質上是定義了乙個陣列指標。
/* 經典的寫法
*/int array[4];
/* 一種更帥的寫法,本質上是定義了乙個陣列指標
*/int (*array)[4];
/* 使用動態分配記憶體的形式,用malloc
*/int **array // array[m][n]
array = (int **)malloc(m * sizeof(int *));
for(int i = 0; i < m; i++)
// 釋放
for(int i = 0; i < m; i++)
free(array[i]);
free(array);
/* 使用動態分配記憶體的形式,用new
*/int **array // array[m][n]
array = new int*[m];
for(int i = 0; i < m; i++)
// 釋放
for(int i = 0; i < m; i++)
delete array[i];
delete array;
不過按照這種形式實現的二維陣列本質上已經不是我們之前說的傳統的二維陣列 了,採用此種方法定義的二維陣列的結構如下圖所示,這樣的二維陣列在堆上分配記憶體。也就是說這樣實現的二維陣列本質上已經是指標陣列了。使用這樣的方式分配二維陣列空間之後,可以使用array[i][j]進行陣列的讀寫操作沒有問題,但是應該知道不同行的記憶體空間不一定連續。這是因為每一行的陣列的記憶體都是使用malloc分配的,多次使用malloc分配的記憶體空間並不一定是連續的,這與在棧上分配的二維矩陣有著根本的不同,比如同樣的對於頂底的二維陣列array[3][4],不能再使用array[0][4]來訪問array[1][0]了,這樣會導致位址越界,就是因為位址不一定連續了。
使用二維陣列作為引數,可以有以下幾種寫法。
希望在使用二維陣列的時候保持良好的程式設計習慣,使用哪種方法定義的就使用哪種方式傳參,這樣對於保持良好的編碼習慣有好處,對於別人閱讀你的**也有好處。
#include using namespace std;
int func1(int **arr)
int main()
memset(*array, 0, sizeof(int)*row*col);
array[0][1] = 100;
func1(array);
cout << array[0][2];
return 0;
}
如果把陣列名作為函式的引數的話,在編譯的時候這個陣列引數會自動退化為指標,因此以下兩種寫法雖然不同,但在編譯之後是一樣的,陣列會退化成陣列指標。
#include using namespace std;
/* * 以下兩種寫法本質上是一樣的
*/int func1(int (*arr)[4])
int func2(int arr[4])
int main()
; array[0][1] = 100;
func1(array);
cout << array[0][2] << endl;
return 0;
}
正是因為這個問題,在定義如下類似求陣列大小的函式的時候必須將陣列引用傳遞!否則陣列會退化為乙個指標,無法正確的使用sizeof運算子求出陣列a所佔記憶體空間大小。
templateint getarraylen(t& a)
C C 二維陣列
已知在c c 中當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。1 二維陣列的概念 在c語言中,二維陣列實際上是一種特殊的一維陣列,它的每個元素也是乙個一維陣列。因此,二維陣列下標形式正確寫法如下 int arrays i j 2 二維陣列作為函式引數 傳遞陣列時必須讓編譯器知道陣列最...
C C 函式傳遞二維陣列
目錄 函式引數傳遞二維陣列的問題 解決方案 1.傳遞第二維和更高維的大小 2.根據陣列的儲存原理把二位陣列當作一維陣列來操作 降維處理 將二維陣列當作引數的時候,必須指明所有維數大小或者省略第一維的,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。在學編譯原理的時候知道編譯器是這樣處理陣...
C C 二維陣列的傳參方法總結
c c 語言將二維陣列作為引數傳遞容易使人迷惑且易出錯,本文將常用的幾種方法列出,以方便用時查閱。三 一種方法總結如下 gcc驗證成功 方法一 形參為二維陣列並給定第二維長度 此方法是最簡單最直觀的方法,形參與實參一樣,容易理解。舉例 cpp view plain copy include void...