C++基础---动态数组

1. 动态数组

1.1 动态数组与静态数组的区别

  • 静态数组
    (1)静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。声明的数组大小要尽可能达到最大,避免发生数组越界,但过度使用这种方法,会导致内存的操作环境变慢。
    (2)对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点。
  • 动态数组
    (1)是相对于静态数组而言的。
    (2)指在声明时没有确定数组大小的数组,可以随程序需要而指定大小,有效利用存储空间。
    (3)动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
    (4)对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则严重会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。
    注:动态数组较灵活、较方便,有助于有效管理内存。

1.2 动态数组的好处

  • 在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。
  • 为了解决上述问题,C++提供了一些内存管理函数,这些内存管理函数结合指针可以按需要动态地分配内存空间,来构建动态数组,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段

1.3 构建动态数组

  • 遵循原则:
    申请的时候从外层往里层,逐层申请;
    释放的时候从里层往外层,逐层释放。
  • 构建所需指针:
    对于构建一维动态数组,需要一维指针;
    对于构建二维,则需要一维,二维指针;
    对于构建三维,则需要一维,二维,三维指针;
    依此类推。
  • new和delete[]运算符用于动态分配和释放数组内存:
  • new:开辟数组空间
    (1)开辟一维数组空间:

    int *a = new int[row];
    for (int i=0; i<row; i++)
    {
        a[i] = i;
    }

    (2)开辟二维数组空间:

    int **a = new int*[row];
    for (int i=0; i<row; i++)
    {
        a[i] = new int[col];
        for (int j=0; j<col; j++)
        {
            a[i][j] = j;
        }
    }

    (3)开辟三维数组空间:

    int ***a = new int**[row];
    for (int i=0; i<row; i++)
    {
        a[i] = new int*[col];
        for (int j=0; j<col; j++)
        {
            a[i][j] = new int[height];
            for (int k=0; k<height; k++)
            {
                a[i][j][k] = k;
            }
        }
    }

    (4)四维及其以上:依此类推。

  • delete[]:释放数组内存
    (1)释放一维数组空间:

    delete[] a; 

    (2)释放二维数组空间:

    for(int i=0; i<row; i++)
    {
        delete[] a[i];
    }
    delete[] a;

    (3)释放三维数组空间:

    for(int i=0; i<row; i++) 
    {
        for(int j=0; j<col; j++) 
        {   
            delete[] a[i][j];   
        }   
    }   
    for(int i=0; i<row; i++)
    {
        delete[] a[i];
    }
    delete[] a;

    (4)四维及其以上:依此类推。
    注:要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。用new和delete可以动态开辟,撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。

1.4 动态数组程序实例

  • 一维动态数组的创建与删除:

    
    #include<iostream>
    
    using namespace std;
    int main()
    {
        //const int row= 5;//静态数组,数组长度必须为常量,大小固定,程序运行中不能修改
        //cout<<"一维数组固定长度为:"<<row<<endl;
        int row;//由于是动态分配数组内存空间,因此无需用常量
        cout<<"设置一维数组长度:";
        cin>>row;
        int *p = new int[row];//new动态分配数组内存,一维动态数组
        for (int i=0; i<row; i++)
        {
            p[i] = i;
        }
        for (int i=0; i<row; i++)
        {
            cout<<"p["<<i<<"] = "<<p[i]<<endl;
        }
        delete[] p;//delete[]释放数组内存
        system("pause");
        return 0;
    }
    =>设置一维数组长度:5
      p[0] = 0
      p[1] = 1
      p[2] = 2
      p[3] = 3
      p[4] = 4
  • 二维动态数组的创建与删除:

    
    #include<iostream>
    
    using namespace std;
    int main()
    {
        int row;//由于是动态分配数组内存空间,因此无需用常量,第一维row的长度
        int col;//由于是动态分配数组内存空间,因此无需用常量,第二维col的长度
        cout<<"第一维row的长度:";
        cin>>row;
        cout<<"第二维col的长度:";
        cin>>col;
        int **p = new int*[row];//new动态分配数组内存,二维动态数组,申请第一维的空间row
        for (int i=0; i<row; i++)
        {
            p[i] = new int[col];
            for (int j=0; j<col; j++)
            {
                p[i][j] = j;
            }
        }
        for (int i=0; i<row; i++)
        {
            for (int j=0; j<col; j++)
            {
                cout<<"p["<<i<<"]["<<j<<"]="<<p[i][j]<<"; ";
            }
            cout<<endl;
        }
        //释放数组内存
        for(int i=0; i<row; i++)
        {
            delete[] p[i];
        }
        delete[] p;
        system("pause");
        return 0;
    }
    =>第一维row的长度:3
      第二维col的长度:4
      p[0][0]=0; p[0][1]=1; p[0][2]=2; p[0][3]=3;
      p[1][0]=0; p[1][1]=1; p[1][2]=2; p[1][3]=3;
      p[2][0]=0; p[2][1]=1; p[2][2]=2; p[2][3]=3;
  • 三维动态数组的创建与删除:

    
    #include<iostream>
    
    using namespace std;
    int main()
    {
        int row;//由于是动态分配数组内存空间,因此无需用常量,第一维row的长度
        int col;//由于是动态分配数组内存空间,因此无需用常量,第二维col的长度
        int height;//由于是动态分配数组内存空间,因此无需用常量,第三维height的长度
        cout<<"第一维row的长度:";
        cin>>row;
        cout<<"第二维col的长度:";
        cin>>col;
        cout<<"第三维height的长度:";
        cin>>height;
        int ***p = new int**[row];//new动态分配数组内存,二维动态数组,申请第一维的空间row
        for (int i=0; i<row; i++)
        {
            p[i] = new int*[col];
            for (int j=0; j<col; j++)
            {
                p[i][j] = new int[height];
                for (int k=0; k<height; k++)
                {
                    p[i][j][k] = k;
                }
            }
        }
        for (int i=0; i<row; i++)
        {
            for (int j=0; j<col; j++)
            {
                for (int k=0; k<height; k++)
                {
                    cout<<"p["<<i<<"]["<<j<<"]["<<k<<"]="<<p[i][j][k]<<"; ";
                }
                cout<<endl;
            }
            cout<<endl;
        }
        //释放数组内存
        for(int i=0; i<row; i++) 
        {
            for(int j=0; j<col; j++) 
            {   
                delete[] p[i][j];   
            }   
        }       
        for(int i=0; i<row; i++)
        {
            delete[] p[i];
        }
        delete[] p;
        system("pause");
        return 0;
    }
    =>第一维row的长度:3
      第二维col的长度:4
      第三维height的长度:5
      p[0][0][0]=0; p[0][0][1]=1; p[0][0][2]=2; p[0][0][3]=3; p[0][0][4]=4;
      p[0][1][0]=0; p[0][1][1]=1; p[0][1][2]=2; p[0][1][3]=3; p[0][1][4]=4;
      p[0][2][0]=0; p[0][2][1]=1; p[0][2][2]=2; p[0][2][3]=3; p[0][2][4]=4;
      p[0][3][0]=0; p[0][3][1]=1; p[0][3][2]=2; p[0][3][3]=3; p[0][3][4]=4;
      p[1][0][0]=0; p[1][0][1]=1; p[1][0][2]=2; p[1][0][3]=3; p[1][0][4]=4;
      p[1][1][0]=0; p[1][1][1]=1; p[1][1][2]=2; p[1][1][3]=3; p[1][1][4]=4;
      p[1][2][0]=0; p[1][2][1]=1; p[1][2][2]=2; p[1][2][3]=3; p[1][2][4]=4;
      p[1][3][0]=0; p[1][3][1]=1; p[1][3][2]=2; p[1][3][3]=3; p[1][3][4]=4;
      p[2][0][0]=0; p[2][0][1]=1; p[2][0][2]=2; p[2][0][3]=3; p[2][0][4]=4;
      p[2][1][0]=0; p[2][1][1]=1; p[2][1][2]=2; p[2][1][3]=3; p[2][1][4]=4;
      p[2][2][0]=0; p[2][2][1]=1; p[2][2][2]=2; p[2][2][3]=3; p[2][2][4]=4;
      p[2][3][0]=0; p[2][3][1]=1; p[2][3][2]=2; p[2][3][3]=3; p[2][3][4]=4;

参考文献:
[1] 百度搜索关键字:C++数组、动态数组、多维动态数组的创建与删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值