二維數組作爲函數的實參,定義函數形參的方法

最近討論了一個關於二維數組做爲實參傳入到函數中,可以定義函數形參的方法,覺得收穫挺大,總結如下:

開始時,討論了幾種方法:

1、直接用二維數組的形式,如:int array[3][4]。

2、用指向數組的指針,如:int (*p)[4]。

3、形參採用指針,如int *p,而在主函數裏進行特殊操作,使二維數組傳值到函數裏。

4、用指向指針的指針,如:int **p。先說明這種方法是錯的,分析在後面。哈哈~~~~

代碼:

  1. #include <iostream>  
  2.  
  3. using namespace std;  
  4.  
  5. void fun(int a[3][4])   //方法1
  6. {  
  7.     for (int i=0; i<3; ++i)  
  8.     {  
  9.         for (int j=0; j<4; ++j)  
  10.         {  
  11.             cout<<a[i][j]<<"\t";  
  12.         }  
  13.         cout<<"\n";  
  14.     }     
  15. }  
  16.  
  17. void fun1(int (*p)[4])   //方法2
  18. {  
  19.     for (int i=0; i<3; ++i)  
  20.     {  
  21.         for (int j=0; j<4; ++j)  
  22.         {  
  23.             cout<<p[i][j]<<"\t";  
  24.         }  
  25.         cout<<"\n";  
  26.     }     
  27. }  
  28.  
  29. void fun2(int *p)   //方法3
  30. {  
  31.     for (int i=0; i<4; ++i)  
  32.     {  
  33.         cout<<p[i]<<"\t";  
  34.     }     
  35.     cout<<"\n";  
  36. }  
  37.  
  38. void fun3(int **p)   //方法4
  39. {  
  40.     for (int i=0; i<3; ++i)  
  41.     {  
  42.         for (int j=0; j<4; ++j)  
  43.         {  
  44.             cout<<p[i][j]<<"\t";  
  45.         }  
  46.         cout<<"\n";  
  47.     }     
  48. }  
  49.  
  50. void main()  
  51. {  
  52.     int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};  
  53.     fun(a);  
  54.     fun1(a);  
  55.     for (int i=0; i<3; ++i)  
  56.     {  
  57.         fun2(*(a+i));  
  58.     }  
  59.     fun3(a);   //編譯發生錯誤,int [][]不能轉化爲int**
  60.  

正確的輸出結果爲: 

  1. 0       1       2       3  
  2. 4       5       6       7  
  3. 8       9       10      11  //前三行,方法1的輸出
  4. 0       1       2       3  
  5. 4       5       6       7  
  6. 8       9       10      11  //中間三行,方法2的輸出
  7. 0       1       2       3  
  8. 4       5       6       7  
  9. 8       9       10      11  //後三行,方法3的輸出
  10. Press any key to continue 

       現在來說明一下方法4的錯誤,可以輸出a和a[0]的地址(cout<<a<<a[0];),它們的值是相同的,也就是說二維數組不能用指向指針的指針來描述。

       當然我們可以使用動態創建數組,這樣我們就可以使用方法4來定義二維數組的形參,代碼如下:

  1. int row = 3;  
  2. int col = 4;  
  3. //////////////////////////////  
  4. //創建動態二維數組  
  5. int **p = new int*[row];  
  6. for (int i=0; i<row; ++i)  
  7. {  
  8.          p[i] = new int[col];  
  9. }  
  10. ///////////////////////////////  
  11. for (i=0; i<row; ++i)  
  12. {  
  13.     for (int j=0; j<col; ++j)  
  14.     {  
  15.         p[i][j] = i*j+j;      //賦值  
  16.     }  
  17. }  
  18.               
  19. cout<<"p="<<p<<"\n"<<"p[0]="<<p[0]<<"\n";//輸出p和p[0]的值  
  20. int b[2][5] = {0};  
  21. cout<<"b="<<b<<"\n"<<"b[0]="<<b[0]<<"\n";//輸出b和b[0]的值  
  22.  
  23. fun3(p);  
  24.  
  25. /////////////////////////////////////////////  
  26. //記得要刪除自己申請的空間  
  27. for (i=0; i<row; ++i)  
  28. {  
  29.     delete[] p[i];  
  30.     cout<<"delete p["<<i<<"]\n";  
  31. }  
  32. delete []p;  
  33. cout<<"delete p\n";  
  34. ///////////////////////////////////////////// 

輸出結果爲:

  1. p=00382DF0  
  2. p[0]=00382E28   //p和p[0]的值不同
  3. b=0012FF44  
  4. b[0]=0012FF44   //b和b[0]的值相同,
  5. //但不是等價的,b代表的是b[0]的地址,而b[0]代表的是b[0][0]的地址
  6. 0       1       2       3  
  7. 0       2       4       6  
  8. 0       3       6       9   //用方法4輸出的結果
  9. delete p[0]   //刪除申請的空間
  10. delete p[1]  
  11. delete p[2]  
  12. delete p  
  13. Press any key to continue 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章