最近討論了一個關於二維數組做爲實參傳入到函數中,可以定義函數形參的方法,覺得收穫挺大,總結如下:
開始時,討論了幾種方法:
1、直接用二維數組的形式,如:int array[3][4]。
2、用指向數組的指針,如:int (*p)[4]。
3、形參採用指針,如int *p,而在主函數裏進行特殊操作,使二維數組傳值到函數裏。
4、用指向指針的指針,如:int **p。先說明這種方法是錯的,分析在後面。哈哈~~~~
代碼:
- #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**
- }
正確的輸出結果爲:
- 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];),它們的值是相同的,也就是說二維數組不能用指向指針的指針來描述。
當然我們可以使用動態創建數組,這樣我們就可以使用方法4來定義二維數組的形參,代碼如下:
- 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