C++动态申请数组

动态申请一维数组

new/delete

#include<iostream>
using namespace std;

void getMem1d(int* &p, int n)
{
    p=new int[n];
    for(int i=0;i<n;i++)
    {
        p[i] = i;
    }
}

int main()
{
    int *p= nullptr;
    int m=10;
    getMem1d(p,m);
    for(int i=0;i<m;i++)
    {
        cout<<p[i]<<" ";
    }
    delete[] p;
    p= nullptr;
	//输出:0 1 2 3 4 5 6 7 8 9
}

若将void getMem1d(int* &p, int n)写成void getMem1d(int* p, int n)则失败**。虽然传入的是指针,但是由于初始化时是空指针,所以分配内存后的指针地址无法返回。传引用可避免此问题。二维数组同理

动态申请二维数组

new/delete

#include<iostream>
using namespace std;

void getMem2d(int **&p, int row, int col)
{
    p = new int *[row];
    for (auto i = 0; i < row; i++)
    {
        p[i] = new int[col];
    }
    for (auto i = 0; i < row; i++)
    {
        for (auto j = 0; j < col; j++)
            p[i][j] = i * col + j;
    }
}

int main()
{
	//方法一
    int **a = nullptr;
    int row = 4, col=5;
    getMem2d(a, row, col);
    std::cout << a << std::endl;
    for (auto i = 0; i < row; i++)
    {
        for (auto j = 0; j < col; j++)
        {
            std::cout << a[i][j] << " ";
        }
    }
    cout << endl;
    for (auto i = 0; i < row; i++)
    {
        delete[] a[i];
    }
    delete[] a;
	
	// 使用auto更简单
	auto p2 = new int[row][col];
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            p2[i][j] = i*col+j;
        }
    }
    cout<<"p2="<<endl;
    for(int i=0;i<row;i++){
        for(int j=0;j<col;j++){
            cout<<p2[i][j]<<" ";
        }
        cout<<endl;
    }
	for (auto i = 0; i < row; i++)
    {
        delete[] p2[i];
    }
    delete[] p2;
    return 0;
}

vector

vector<vector<int>> getMemVec(int n)
{
    vector<vector<int>> p(n,vector<int>(n));
    for(auto &i : p)
    {
        for(auto &j : i)
        {
            j=1;
        }
    }
    return p;
}
posted @ 2022-05-10 15:29  围城chen  阅读(436)  评论(0编辑  收藏  举报