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


    查漏补缺,为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

  • 相关阅读:
    Linux pwn入门教程(1)——栈溢出基础
    Java代码审计入门篇
    利用Burp Suite攻击Web应用
    记一次对某企业的渗透测试实战
    Python 绝技 —— UDP 服务器与客户端
    SQL注入之重新认识
    文件上传和WAF的攻与防
    phpMyAdmin 4.7.x CSRF 漏洞利用
    Powershell渗透测试系列–进阶篇
    AFN检測网络情况
  • 原文地址:https://www.cnblogs.com/music-liang/p/12054459.html
Copyright © 2020-2023  润新知