关于C++的动态数组

一、动态数组的优点:
动态分配内存,用一个指针传值方便。

二、为什么我要用动态数组?
在程序中遇到数组的传递时,函数中的创建的数组由于在函数作用域
外无效,所以不能有效的传递。

三、动态数组实例:

一维动态数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
    //使用new,在程序运行时动态分配空间
    int * arr = new int[10];
    //赋值方法和普通数组通用
    for(int i = 0 ; i < 10 ; i++ )
    {
        arr[i] = i;
    }
    //释放空间
    delete []arr;

    return 0;
}

使用new 和delete时应当注意:
1.不要使用delete来释放不是new分配的内存
2.不要使用delete来释放同一个内存块两次
3.如果使用new[]维数组分配内存,则应使用delete[]来释放
4.如果使用new[]来为一个实体分配内存,则应使用delete(没有方括号)来释放内存
5.对空指针使用delete是安全的

二维动态数组:

两种二维数组开辟空间的方法:
方法1:

1
2
3
4
5
6
7
8
9
    int r,c;//r is rows ,c is cols
    r = 5 ;
    c = 8 ;
    //method 1 to initialize a dynamic-planar arr
        int **arr = new int*[r];
    for (int i = 0 ; i <r ; ++i)
    {
        arr[i] = new int[c];
    }

上面方法的创建的二维数组是不连续的,所以需要进行寻址,
如果要进行赋初值,必须一一赋值,而不能一次用:
arr[0]={0}将arr全部赋值为0。

寻址和赋初值为0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    //method 1 to initialize a dynamic-planar arr
   //寻址
     for(int i = 1 ; i < r ; ++i)
     {
          arr[i] = arr[i - 1] + c ;
     }
    //赋初值为0
    for(int i = 0 ; i < r ; i++)
    {
        for(int j = 0 ; j < c ; j++ )
        {
            arr[i][j] = 0;
        }
    }

方法2:

1
2
3
4
5
6
7
8
9
10
11
    //method 2 to initialize a dynamic-planar arr
    int ** arr = new int*[r];
    int size = r*c;
    arr[0]= new int[size];
    for(int i = 1 ; i < r ; i++)
    {
        arr[i] = &arr[0][i*c];
    }
    //using std::fill to fill 0
    std::fill( &arr[0][0], &arr[0][0]+r*c, 0);
    //上面的方法1寻址后即可用此方法填满

二维动态数组空间释放:

1
2
3
4
5
    for(int i = 0 ; i < r ; i++)
    {
        delete [] arr[i];
    }
    delete [] arr;

如果二维动态数组作为返回值或者参数的方法见完整函数:
https://github.com/ghostxiu/justfortest/blob/master/arr.cc