二維數組做爲參數傳遞

//二維數組傳參問題示例  
#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

  

  1. int main()  
  2. {  
  3.     int m = 10;  
  4.     int n = 10;  
  5.     int** p = new int[m][n];  
  6. }  

 

會發現編譯不經過,第二個維度長度必須爲常量。那麼怎麼聲明一個兩個維度都能動態指定的二維數組呢?看下面:數組

 
  1. void func5(int** pArray, int m, int n)  
  2. {  
  3.   
  4. }  
  5.   
  6. #include <ctime>  
  7. int main()  
  8. {  
  9.     int m = 10;  
  10.     int n = 10;  
  11.   
  12.     int** pArray = new int* [m];  
  13.     pArray[0] = new int[m * n]; // 分配連續內存  
  14.   
  15.     // 用pArray[1][0]沒法尋址,還需指定下標尋址方式  
  16.     for(int i = 1; i < m; i++)  
  17.     {  
  18.         pArray[i] = pArray[i-1] + n;  
  19.     }  
  20.   
  21.     func5(pArray, m, n);  
  22. }  
   

這裏爲二維數組申請了一段連續的內存,而後給每個元素指定尋址方式(也能夠爲每個元素分別申請內存,就沒必要指定尋址方式了),最後將雙重指針做爲實參傳遞給func5。這裏func5多了兩個形參,是二維數組的維度,也能夠不聲明這兩個形參,可是爲了安全嘛,仍是指定的好。最後編譯,運行,一切OK。總結一下,上面的代碼實際上是實現了參數傳遞動態建立的二維數組。安全

相關文章
相關標籤/搜索