0%

C++二级指针和二维数组(不使用Vector)

  • 不要将二级指针和二维数组混为一谈,二维数组再指针作为起始地址的基础上必须还知道第二维度的长度才可以,因为实际上的数组索引操作是i*<第二维度大小> + j

    动态二维数组的创建和销毁(不使用Vector)

  • 创建
    double **dataMat;
    dataMat = new double* [x_size];
    for(int i = 0;i<xSize;i++)
    {
    dataMat[i] = new double[ySize];
    }
  • 参考链接
  • 释放二维数组
    for(int i = 0;i<数组第一维的数量>;i++)
    {
    delete dataMat[i];
    }
    delete dataMat;
  • 先逐个释放数组的行,然后再释放整个数组

    动态二维数组的传参

  • 对于正常创建的二维数组(不是使用上文的方法创建的动态数组)
    //方法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;
    }


  • 假如预先不知道数组的第二维度是多少的话,还是只能使用强制类型转换为一级指针的方法传递。
  • 参考链接