C++二维动态数组的创建与删除

本文介绍了在C++中如何动态创建二维数组的两种方法,一种是直接指定列数进行创建,另一种是通过指针数组逐行分配内存。并详细展示了创建及释放内存的具体步骤。

C++中用new动态创建二维数组的格式一般是这样:

TYPE (*p)[N] = new TYPE [][N];

其中,TYPE是某种类型,N是二维数组的列数。采用这种格式,列数必须指出,而行数无需指定。在这里,p的类型是TYPE*[N],即是指向一个有N列元素数组的指针。

还有一种方法,可以不指定数组的列数:

int **p;
p = new int*[10];    //注意,int*[10]表示一个有10个元素的指针数组
for (int i = 0; i != 10; ++i)
{
    p[i] = new int[5];
}

这里是将p作为一个指向指针的指针,它指向一个包含10个元素的指针数组,并且每个元素指向一个有5个元素的数组,这样就构建了一个10行5列的数组。


当数组使用完毕,释放空间的代码是:

for(int i = 0; i != 5; i++)
{
    delete[] p[i];
}
 delete[] p;

处理二维数组,可以用降维或是二维法。
降维法是用一位数组来接受二维数组,将二维元素的首地址&a[0][0]作为参数,传递给函数,函数用int *接受。
二维法就直接用二维数组来接受,但是需要指定列数。

 

 

 

 

如要想创建一个[m][n]的二维数组。

下面为通过动态创建一个指针数组的方法来动态创建二维数组的方法。

C版本:

 double **data;

 data = (double **)malloc(m*sizeof(double *));
 for(int j=0;j<m;j++)
 {
  data[j] = (double*)malloc(n*sizeof(double));
  //这个指针数组的每个指针元素又指向一个数组。
 }
 
 for (int i=0;i<m;i++)
 {
  for (int j=0;j<n;j++)
  {
   data[i][j]=i*n+j;//初始化数组元素
  }
 }

 for (i=0;i<m;i++)
 {
  free(data[i]);
 //先撤销指针元素所指向的数组
              
 free(data);

 

C++版本:

double **data;

data = new double*[m]; //设置行 或直接double **data=new double*[m]; 一个指针指向一个指针数组。

for(int j=0;j<m;j++)
{
data[j] = new double[n];
        //这个指针数组的每个指针元素又指向一个数组。
}

for (int i=0;i<m;i++)

{
   for (int j=0;j<n;j++)
   {
    data[i][j]=i*n+j;//初始化数组元素
   }

}

for (i=0;i<m;i++)
{
 delete[] data[i]; //先撤销指针元素所指向的数组
                    
delete[] data

 

这种方法是通过先动态创建一个指针数组,然后为指针数组的每个元素再动态指向一个数组的办法来完成的。其创建过程与销毁过程两样重要。

在销毁的过程,先销毁指针数组每个元素指向的数组,然后再销毁这个指针数组。

### C++二维动态数组创建使用 在 C++ 编程中,可以通过多种方式来实现二维动态数组创建和管理。以下是几种常见的方法及其具体实现。 #### 方法一:通过 `new` 和 `delete` 手动分配内存 可以利用指针手动分配二维数组所需的内存空间,并在程序结束前释放这些资源以防止内存泄漏。这种方法较为灵活但也容易出错,因此需要特别注意内存管理。 ```cpp #include <iostream> using namespace std; #define ROW 2 // 行数 #define COLUMN 3 // 列数 #define VALUE 1 // 数组元素值 int main() { int **arr = new int*[ROW]; for (int i = 0; i < ROW; i++) { arr[i] = new int[COLUMN]; // 分配每行的空间 } // 初始化并打印数组 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COLUMN; j++) { arr[i][j] = VALUE; cout << arr[i][j] << " "; } cout << endl; } // 释放内存 for (int i = 0; i < ROW; i++) { delete[] arr[i]; // 删除每行 } delete[] arr; // 删除指向各行的指针数组 return 0; } ``` 此代码片段展示了一个简单的二维动态数组创建过程[^1]。 --- #### 方法二:使用 STL 容器 `std::vector` 相比手动管理内存的方式,STL 提供了更安全、高效的解决方案——`std::vector`。它能够自动处理内存分配和释放问题,从而减少程序员的工作量以及潜在错误的发生概率。 下面的例子演示了如何借助 `std::vector` 构建一个具有指定大小及默认填充值的二维动态数组: ```cpp #include <iostream> #include <vector> using namespace std; int main() { const size_t row = 2, column = 3; // 设置行列数量 vector<vector<int>> matrix(row, vector<int>(column, 0)); // 填充矩阵中的数值 for (size_t i = 0; i < row; ++i) { for (size_t j = 0; j < column; ++j) { matrix[i][j] = static_cast<int>(i * column + j); } } // 输出结果到控制台 for (const auto& row_vec : matrix) { for (const auto& elem : row_vec) { cout << elem << ' '; } cout << '\n'; } return 0; } ``` 上述例子说明了基于向量构建二维动态数组的方法[^2]。 --- #### 方法三:字符型二维动态数组实例 除了整数类型外,还可以针对其他数据类型(如字符串或字符)定义类似的结构体形式来进行存储操作。这里给出了一段关于读取输入作为字符串集合存入二维表单内的示范源码: ```cpp #include <iostream> #include <vector> #include <string> // 需要引入 string 头文件支持 using namespace std; int main(){ int n,m; cin >> n >> m; vector<string> strArray(n); for(auto &s:strArray){ getline(cin,s); // 输入多行文本至各子串对象里去 } for(const auto &line:strArray){ for(char ch: line){ cout<<ch<<" "; } cout<<"\n"; } return 0; } ``` 这段脚本解释了怎样把用户提供的若干条记录按照行列布局保存下来再逐一显示出来[^4]。 --- #### 总结注意事项 无论采用哪种技术手段完成任务目标,在实际开发过程中都应遵循良好的编程习惯,比如及时清理不再使用的变量占用的堆区位置以防泄露;另外也要考虑到边界条件下的异常情况处置策略等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值