原文:https://blog.csdn.net/yunyun1886358/article/details/5659851數組
這裏僅爲了本身記錄安全
今天在論壇上有朋友提問:聲明函數以下void function(int** pInt),意圖是想參數傳遞一個二維數組。因而就定義了一個二維數組,好比 int[1][1],而後調用函數。結果如何?固然是失敗了,編譯器提示:cannot convert parameter 1 from 'int [1][1]' to 'int **',參數類型不匹配。上述過程我本身也試了,固然不匹配,類型徹底不同嘛。而後我就想了:若是要將一個二維數組做爲形參,那麼函數該怎麼聲明?函數
來看《C++ Primer》中給出的方法:spa
編譯經過,注意形參聲明必定要給出第二個維度的大小,要不編譯不過。.net
其實二維數組名就是一個指向一維數組的指針,因此這種聲明方式OK。必須指定一維數組的長度,若是沒有指定的話,函數聲明編譯經過。可是若是一旦有調用代碼,就有編譯不經過,由於沒有實參類型能匹配int[].指針
必須指定兩個維度的長度。blog
必須指定兩個維度的長度。ip
以上方法均可以等價使用,對數組來講,沒有值傳遞。內存
還不知足,還有其餘的聲明方式嗎?回到本文開始提到的問題:能夠用雙重指針int**做爲形參,接受二維數組實參嗎?答案是確定的,可是又侷限性。用雙重指針做爲形參,那麼相應的實參也要是一個雙重指針。事實上,這個雙重指針其實指向一個元素是指針的數組,雙重指針的聲明方式,很適合傳遞動態建立的二維數組。怎麼動態建立一個二維數組?以下程序:get
會發現編譯不經過,第二個維度長度必須爲常量。那麼怎麼聲明一個兩個維度都能動態指定的二維數組呢?看下面:
這裏爲二維數組申請了一段連續的內存,而後給每個元素指定尋址方式(也能夠爲每個元素分別申請內存,就沒必要指定尋址方式了),最後將雙重指針做爲實參傳遞給func5。這裏func5多了兩個形參,是二維數組的維度,也能夠不聲明這兩個形參,可是爲了安全嘛,仍是指定的好。最後編譯,運行,一切OK。總結一下,上面的代碼實際上是實現了參數傳遞動態建立的二維數組。