C++动态内存分配指针遍历一至三维数组详解(含源码)

本博文源于自学C++过程中的一些心得,旨在讲述如何用指针访问多维数组,中间数组全部使用内存分配。

动态内存分配与释放操作

动态内存分配所分配的元素全部在堆上,也就是在动态创建堆对象,动态分配单个变量的语法形式为:

new T(初值列表);

动态分配一维数组的语法形式为:

new T[元素个数];

运算符delete用来删除由new建立的对象,释放指针所指向的内存空间。释放单个变量空间的语法形式为:

delete 指针名;

释放动态数组空间的语法形式为:

delete []指针名;

一维数组

实验效果

C++动态内存分配指针遍历一至三维数组详解(含源码)_第1张图片

实验内容

  1. 创建一维new分配的数组,一维指针指向它
  2. 开始赋值,开始遍历
  3. 遍历结束,动态内存delete回收

实验源码

特意加上注释,注释处是代码核心

#include
#include
using namespace std;

int main(){
	int size;
	cout << "please enter the number of the sequence:" << endl;
	cin >> size;
	int *p = new int[size];//创建一维指针指向一维动态分配数组
	int i;
	for(i=0; i<size;i++){
		p[i] = i;//数组赋值
		
	}
	cout << "the sequence is:" <<endl;
	for(i=0;i<size;i++){
		cout << setw(4) << p[i];//数组遍历
		
	}
	cout << endl;
	delete[] p;//因为是一维数组形式,所以加上[]动态回收
	return 0;
}

二维数组

实验效果

C++动态内存分配指针遍历一至三维数组详解(含源码)_第2张图片

实验内容

  1. 创建二维new分配的数组,一维数组指针指向它
  2. 开始赋值,开始遍历
  3. 遍历结束,动态内存数组delete回收

实验源码

注释处比较重点,涉及动态内存申请,动态内存赋值,动态内存使用指针遍历,动态内存释放问题

#include
#include
using namespace std;
int main()
{
	int (*p)[3];//创建指针数组
	p = new int[2][3];//动态申请二维数组
	int i;
	int num = 0;
	for(i=0;i < 2;i++){
		for(int j =0;j<3;j++){
			p[i][j] = num++;//二维数组进行赋值
		}
	}
	cout << "the matrix is:" << endl;
	for(i=0;i<2;i++){
		for(int j = 0;j<3;j++){
			cout << setw(3) << *(*(p+i)+j);//等价于p[i][j]这里用指针形式访问
		}
		cout << endl;
	}
	delete[] p;//动态内存进行回收
	return 0;
	
		
}

三维数组

实验效果

C++动态内存分配指针遍历一至三维数组详解(含源码)_第3张图片

实验内容

  1. 创建三维new分配的数组,二维数组一级指针指向它
  2. 开始赋值,开始遍历
  3. 遍历结束,动态内存数组delete回收

实验源码

#include
#include
using namespace std;
int main()
{
	int (*p)[3][4];//创建二维一级指针
	p = new int[2][3][4];//动态分配内存
	int i;
	int num = 0;
	for(i=0;i < 2;i++){
		for(int j =0;j<3;j++){
			for(int k = 0;k<4;k++){
					p[i][j][k] = num++;//内存数组赋值

			}
					}
	}
	cout << "the matrix is:" << endl;
	for(i=0;i<2;i++){
		for(int j = 0;j<3;j++){
			for(int k=0;k<4;k++){
					cout << setw(3) << *(*(*(p+i)+j)+k);//指针遍历
			}
			cout << endl;
		}
		cout << endl;
	}
	delete[] p;//释放内存
	return 0;
	
		
}

多维数组大胆预测

先假定特殊情况四维数组,步骤如下

1.int (*p)[j][k][l];//创建三维一级指针
2.p=new int [i][j][k][l]//动态分配
3.p[i][j][k][l]=nun//动态赋值
4.*(*(*(*(p+i)+j)+k)+l);//指针遍历
5.delete[] p

因此不管多少维动态分配数组,只需要n-1维指针数组就行了。

总结

本博文从动态内存分配开始讲起,先一维数组简单遍历,然后瞬间推至多维。最u后得出结论,不管多少维度动态内存分配,n-1维指针数组可以有效遍历!

你可能感兴趣的:(面向对象,c++,指针,内存管理,内存泄漏)