二维数组做为参数传递

//二维数组传参问题示例  
#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。总结一下,上面的代码实际上是实现了参数传递动态建立的二维数组。安全

相关文章
相关标签/搜索