C++中给二维指针分配内存

本文详细介绍了在C++中如何使用new和delete[]关键字为二维指针分配和撤销内存,通过实例代码展示了具体操作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      我们都知道在 C++ 中分配动态数组用的是 new , 撤销动态数组用的是 delete[ ] ,现在让我们来看看怎么利用这两个关键字给二维指针分配内存。

      原理就不写在这里了,毕竟网上的介绍有很多,代码如下所示:

#include <iostream>
using namespace std;

#define		N		5
#define		M		10

int main(int argc, char **argv)
{
	int **p;
	int i,j;

	p = new int* [N];
	for (i = 0; i < N; i++)
		p[i] = new int [M];

	for (i = 0; i < N; i++)
		for (j = 0; j < M; j++)
			p[i][j] = i + j;

	for (i = 0; i < N; i++)
	{
		for (j = 0; j < M; j++)
		{	
			cout<<"["<<p[i][j]<<"]"<<"  ";
			cout<<*(*(p + i) + j)<<" "<<endl;
		}
		cout<<endl;
	}

	for (i = 0; i < N; i++)
	{
		delete [] p[i];
		p[i] = NULL;
	}
		
	delete [] p;
	p = NULL;

	return 0;
}


### 动态分配二维指针内存C++中,可以使用`new`运算符为二维指针动态分配内存。具体来说,可以通过先创建指向每一行的指针数组,再分别为每行分配空间来实现这一目标。 以下是详细的说明以及代码示例: #### 创建二维指针 为了创建一个具有`m`行和`n`列的二维数组,首先需要声明一个指向指针类型的变量(即二维指针)。接着,通过`new`操作符为其分配足够的存储空间以容纳所有的行,并逐行为这些行分配相应的列数。 ```cpp #include <iostream> int main() { int m = 3; // Number of rows int n = 4; // Number of columns // Step 1: Allocate space for row pointers. int** matrix = new int*[m]; // Step 2: Allocate space for each column in every row. for(int i = 0; i < m; ++i){ matrix[i] = new int[n]; } // Initialize values (optional). for(int i = 0; i < m; ++i){ for(int j = 0; j < n; ++j){ matrix[i][j] = i * n + j; } } // Print out the contents of the matrix. for(int i = 0; i < m; ++i){ for(int j = 0; j < n; ++j){ std::cout << matrix[i][j] << "\t"; } std::cout << std::endl; } // Free allocated memory to prevent leaks. for(int i = 0; i < m; ++i){ delete[] matrix[i]; // Delete individual arrays first. } delete[] matrix; // Then, delete the array of pointers. return 0; } ``` 此程序展示了如何利用双重循环结构初始化并打印出所构建矩阵的内容。最后一步非常重要——释放之前申请过的堆内存资源以防泄漏[^1]。 注意,在实际应用过程中如果遇到更复杂的场景或者更大的数据集时,则可能还需要考虑异常处理机制等问题以免因中途失败而导致部分清理工作未被执行的情况发生。 #### 使用标准库容器替代手动管理 尽管上面的方法有效,但在现代C++编程实践中推荐尽量采用STL中的容器类比如`vector<vector<int>>`代替原始指针来进行类似的多维数组操作,这样不仅可以简化语法而且还能自动完成必要的资源管理工作从而减少错误发生的可能性。 ```cpp #include <iostream> #include <vector> int main(){ const size_t ROWS = 3; const size_t COLS = 4; std::vector<std::vector<int>> vec(ROWS, std::vector<int>(COLS)); for(size_t r=0;r<vec.size();r++){ for(size_t c=0;c<vec[r].size();c++) { vec[r][c]=static_cast<int>(r)*static_cast<int>(COLS)+static_cast<int>(c); } } for(auto &row : vec){ for(auto elem : row){ std::cout<<elem<<"\t"; } std::cout<<'\n'; } return 0; } ``` 这里我们定义了一个由整型向量组成的向量对象代表我们的二维表单形式的数据集合体;填充过程同样借助嵌套for-loops达成目的;由于整个生命周期都处于栈上所以无需担心任何关于销毁的事情因为当超出作用域之后它们会自行析构掉自己内部的一切成员成分包括那些原本属于自由商店区域的部分也都会被妥善处置好[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值