來看《c++ primer》中給出的方法:
[cpp]view plain
copy
void
func1(
intiarray[10])
intmain()
編譯通過,注意形參宣告一定要給出第二個維度的大小,要不編譯不過。
[cpp]view plain
copy
void
func2(
int(*parray)[10])
void
func2_1(
int(*parray))
//編譯通過,無法呼叫
intmain()
其實二維陣列名就是乙個指向一維陣列的指標,所以這種宣告方式ok。必須指定一維陣列的長度,如果沒有指定的話,函式宣告編譯通過。但是如果一旦有呼叫**,就有編譯不通過,因為沒有實參型別能匹配int.
[cpp]view plain
copy
void
func3(
int(&parray)[10][10])
intmain()
必須指定兩個維度的長度。
[cpp]view plain
copy
void
func4(
int(*parray)[10][10])
intmain()
必須指定兩個維度的長度。
以上方法都可以等價使用,對陣列來說,沒有值傳遞。
還不滿足,還有其他的宣告方式嗎?回到本文開始提到的問題:可以用雙重指標int**作為形參,接受二維陣列實參嗎?答案是肯定的,但是又侷限性。用雙重指標作為形參,那麼相應的實參也要是乙個雙重指標。事實上,這個雙重指標其實指向乙個元素是指標的陣列,雙重指標的宣告方式,很適合傳遞動態建立的二維陣列。怎麼動態建立乙個二維陣列?如下程式:
[cpp]view plain
copy
intmain()
會發現編譯不通過,第二個維度長度必須為常量。那麼怎麼宣告乙個兩個維度都能動態指定的二維陣列呢?看下面:
[cpp]view plain
copy
void
func5(
int** parray,
intm,
intn)
#include
intmain()
func5(parray, m, n);
}
這裡為二維陣列申請了一段連續的記憶體,然後給每乙個元素指定定址方式(也可以為每乙個元素分別申請記憶體,就不必指定定址方式了),最後將雙重指標作為實參傳遞給func5。這裡func5多了兩個形參,是二維陣列的維度,也可以不宣告這兩個形參,但是為了安全嘛,還是指定的好。最後編譯,執行,一切ok。總結一下,上面的**其實是實現了引數傳遞動態建立的二維陣列。
二維陣列的總結
關於二維陣列的總結 1.二維陣列的建立和初始化 陣列建立 int arr 3 4 char arr 3 5 double arr 2 4 陣列初始化 int arr 3 4 無論是幾維陣列,定義的時候只有第乙個的數字可以省絡 int arr 4 舉例1.include intmain for int...
二維陣列的定義和引用
一 陣列 陣列是乙個構造型別的資料結構,是許多個相同型別的資料的集合。二 二維陣列例項 include static void print str char str 4 static void print str char str 4 int main print str str return 0 ...
C C 二維陣列總結
先說在前面,一般的我們說的c c 中的二維陣列是定義在棧中的二維陣列。比如定義了乙個array 3 4 那就指的是定義了乙個三行四列的矩陣形狀的二維陣列,如下圖所示。這樣的矩陣在記憶體中是以箭頭右邊的方式存放的,也就是說實際上我們定義的二維陣列在記憶體中仍然像是一維陣列那樣連續儲存的。可以想象為把乙...