//二維數組傳參問題示例 #include<iostream> using namespace std; //方法1:傳遞數組,注意第二維必須標明 void fun1(int arr[][3],int iRows) { for(int i=0;i<iRows;i++) { for(int j=0;j<3;j++) { cout<<arr[i][j]<<" "; } cout<<endl; } cout<<endl; } //方法二:一重指針 void fun2(int (*arr)[3],int iRows) { for(int i=0;i<iRows;i++) { for(int j=0;j<3;j++) { cout<<arr[i][j]<<" "; } cout<<endl; } cout<<endl; } //方法三:指針傳遞,無論是幾維數組都把他當作是指針, void fun3(int*arr,int iRows,int iCols) { for(int i=0;i<iRows;i++) { for(int j=0;j<3;j++) { cout<<*(arr+i*iRows+j)<<" "; } cout<<endl; } cout<<endl; } int main() { int a[2][3]={{1,2,3},{4,5,6}}; fun1(a,2); cout<<endl; fun2(a,2); cout<<endl; //此處必須進行強制類型轉換,由於a是二維數組,而須要傳入的是指針 //因此必須強制轉換成指針,若是a是一維數組則沒必要進行強制類型轉換 //爲何一維數組不用強制轉換而二維數組必須轉換,此問題還沒解決,期待大牛! fun3((int*)a,2,3); cout<<endl; }
用雙重指針int**做爲形參,接受二維數組實參嗎?答案是確定的,可是又侷限性。用雙重指針做爲形參,那麼相應的實參也要是一個雙重指針。事實上,這個雙重指針其實指向一個元素是指針的數組,雙重指針的聲明方式,很適合傳遞動態建立的二維數組。怎麼動態建立一個二維數組?以下程序:ios
會發現編譯不經過,第二個維度長度必須爲常量。那麼怎麼聲明一個兩個維度都能動態指定的二維數組呢?看下面:數組
這裏爲二維數組申請了一段連續的內存,而後給每個元素指定尋址方式(也能夠爲每個元素分別申請內存,就沒必要指定尋址方式了),最後將雙重指針做爲實參傳遞給func5。這裏func5多了兩個形參,是二維數組的維度,也能夠不聲明這兩個形參,可是爲了安全嘛,仍是指定的好。最後編譯,運行,一切OK。總結一下,上面的代碼實際上是實現了參數傳遞動態建立的二維數組。安全