最近討論了一個關於二維數組作爲實參傳入到函數中,能夠定義函數形參的方法,以爲收穫挺大,總結以下:ios
開始時,討論了幾種方法:數組
一、直接用二維數組的形式,如:int array[3][4]。ide
二、用指向數組的指針,如:int (*p)[4]。函數
三、形參採用指針,如int *p,而在主函數裏進行特殊操做,使二維數組傳值到函數裏。this
四、用指向指針的指針,如:int **p。先說明這種方法是錯的,分析在後面。哈哈~~~~spa
代碼:指針
- #include <iostream>
- using namespace std;
- void fun(int a[3][4]) //方法1
- {
- for (int i=0; i<3; ++i)
- {
- for (int j=0; j<4; ++j)
- {
- cout<<a[i][j]<<"\t";
- }
- cout<<"\n";
- }
- }
- void fun1(int (*p)[4]) //方法2
- {
- for (int i=0; i<3; ++i)
- {
- for (int j=0; j<4; ++j)
- {
- cout<<p[i][j]<<"\t";
- }
- cout<<"\n";
- }
- }
- void fun2(int *p) //方法3
- {
- for (int i=0; i<4; ++i)
- {
- cout<<p[i]<<"\t";
- }
- cout<<"\n";
- }
- void fun3(int **p) //方法4
- {
- for (int i=0; i<3; ++i)
- {
- for (int j=0; j<4; ++j)
- {
- cout<<p[i][j]<<"\t";
- }
- cout<<"\n";
- }
- }
- void main()
- {
- int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
- fun(a);
- fun1(a);
- for (int i=0; i<3; ++i)
- {
- fun2(*(a+i));
- }
- fun3(a); //編譯發生錯誤,int [][]不能轉化爲int**
- }
正確的輸出結果爲: string
- 0 1 2 3
- 4 5 6 7
- 8 9 10 11 //前三行,方法1的輸出
- 0 1 2 3
- 4 5 6 7
- 8 9 10 11 //中間三行,方法2的輸出
- 0 1 2 3
- 4 5 6 7
- 8 9 10 11 //後三行,方法3的輸出
- Press any key to continue
如今來講明一下方法4的錯誤,能夠輸出a和a[0]的地址(cout<<a<<a[0];),它們的值是相同的,也就是說二維數組不能用指向指針的指針來描述。it
固然咱們可使用動態建立數組,這樣咱們就可使用方法4來定義二維數組的形參,代碼以下:io
- int row = 3;
- int col = 4;
- //////////////////////////////
- //建立動態二維數組
- int **p = new int*[row];
- for (int i=0; i<row; ++i)
- {
- p[i] = new int[col];
- }
- ///////////////////////////////
- for (i=0; i<row; ++i)
- {
- for (int j=0; j<col; ++j)
- {
- p[i][j] = i*j+j; //賦值
- }
- }
- cout<<"p="<<p<<"\n"<<"p[0]="<<p[0]<<"\n";//輸出p和p[0]的值
- int b[2][5] = {0};
- cout<<"b="<<b<<"\n"<<"b[0]="<<b[0]<<"\n";//輸出b和b[0]的值
- fun3(p);
- /////////////////////////////////////////////
- //記得要刪除本身申請的空間
- for (i=0; i<row; ++i)
- {
- delete[] p[i];
- cout<<"delete p["<<i<<"]\n";
- }
- delete []p;
- cout<<"delete p\n";
- /////////////////////////////////////////////
輸出結果爲:
- p=00382DF0
- p[0]=00382E28 //p和p[0]的值不一樣
- b=0012FF44
- b[0]=0012FF44 //b和b[0]的值相同,
- //但不是等價的,b表明的是b[0]的地址,而b[0]表明的是b[0][0]的地址
- 0 1 2 3
- 0 2 4 6
- 0 3 6 9 //用方法4輸出的結果
- delete p[0] //刪除申請的空間
- delete p[1]
- delete p[2]
- delete p
- Press any key to continue