二维数组申请内存和参数传递问题

查漏补缺,为2020年春季面试做准备。

问题1:二维数组,如何作为参数传递

问题2:二维数组,如何申请内存空间

问题3:二维数组,申请内存之后,如何释放的。

#include <iostream>
using namespace std;
/*传二维数组*/

//第1种方式:传数组,第二维必须标明
/*void display(int arr[][4])*/
void display1(int arr[][4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            cout<<arr[i][j]<<" ";     //可以采用parr[i][j]
        }
        cout<<endl;
    }
    cout<<endl;
}
//第2种方式:一重指针,传数组指针,第二维必须标明
/*void display(int (*parr)[4])*/
void display2(int (*parr)[4],const int irows)
{
    for (int i=0;i<irows;++i)
    {
        for(int j=0;j<4;++j)
        {
            cout<<parr[i][j]<<" ";    //可以采用parr[i][j]
        }
        cout<<endl;
    }
    cout<<endl;
}
//注意:parr[i]等价于*(parr+i),一维数组和二维数组都适用
//第3种方式:传指针,不管是几维数组都把他看成是指针
/*void display3(int *arr)*/
void display3(int *arr,const int irows,const int icols)
{
    for(int i=0;i<irows;++i)
    {
        for(int j=0;j<icols;++j)
        {
////请注意。。这种读取方式,只适合静态二维数组,不适合动态分配的二维数组。动态分的二维数组,一行内是连续地址,但是每一行之间并不连续。。。 cout
<<*(arr+i*icols+j)<<" "; //注意:(arr+i*icols+j),不是(arr+i*irows+j) } cout<<endl; } cout<<endl; }
int main()
{
    int arr[][4]={0,1,2,3,4,5,6,7,8,9,10,11};
    int irows=3;
    int icols=4;
    display1(arr,irows);
    display2(arr,irows);

    //注意(int*)强制转换.个人理解:相当于将a拉成了一维数组处理。
    display3((int*)arr,irows,icols);
    return 0;
}

二维数组,申请内存空间,和释放内存空间问题:

int** copyPath =new int*[rows];
for (int i = 0; i < rows; i++)
{
    copyPath[i] = new int[cols];
}
    

    
for (int i = 0; i < rows; i++)
{
    delete[] copyPath[i];
}
delete[] copyPath;


/////直接声明的方式
int arrPath[4][4] = { { 1, 3, 5, 9 }, { 8, 1, 3, 4 }, { 5, 0, 6, 1 }, { 8, 8, 4, 0 } };

二维数组,作为参数传递和访问的正确操作方法。  

void VisitDynamicArr2(int **num , int rows, int cols) 这里使用int **作为参数来传递动态的二维数组。

分为静态二维数组和动态二维数组两种形式。

///////////////////////二维静态数组
void VisitStaticArr1(int **num, int rows,int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
//            cout << num[i][j] << endl; //ERROR...
            ////这种方式只适合静态的连续的内存空间。。动态分配的二维数组,(一行内是连续的)但是,每一行并不是连续的。
            cout << *((int*)num + i*cols + j)<<", ";
        }
        cout << endl;
    }
    cout << endl;
}

void testArr1()
{
    int num[4][5];//静态的
    int iCount = 0;
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            num[i][j] = iCount;
            iCount++;
        }
    }

    VisitStaticArr1((int**)num, 4, 5);  //OK
//    VisitStaticArr1(num, 4, 5);  //ERROR.Not OK..无法将参数 1 从“int [4][5]”转换为“int **”
}
//////////////////////二维动态数组
void VisitDynamicArr2(int **num , int rows, int cols)
{
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            cout << num[i][j] << ", ";
        }
        cout << endl;
    }
    cout << endl;
}

void TestArr2()
{
    int rows = 4;
    int cols = 5;
    //动态申请内存空间
    int **num = new int*[rows];
    for (int i = 0; i < rows; i++)
    {
        //每一行的内存空间和上一行不一定连续
        num[i] = new int[cols];
    }

    //赋初值
    int iCount = 0;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            num[i][j] = iCount;
            iCount++;
        }
    }
    

    VisitDynamicArr2(num, rows, cols);//OK
    VisitDynamicArr2((int **)num, rows, cols);//OK



    ///释放资源
    for (int i = 0; i < rows; i++)
    {
        delete[] num[i];
    }
    delete[] num;
}

参考地址:https://www.cnblogs.com/usa007lhy/p/3286186.html

原文地址:https://www.cnblogs.com/music-liang/p/12054459.html