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;
}