如何在C++中使用动态三维数组
1. 使用new和delete来构造
在使用new申请内存时,在使用过后,一定要采用delete来进行释放内存。
使用该方法创建动态数组时,需要由数组的角标依次向右进行创建;
同时,也需要依照角标,从左到右来进行删除。
代码功能为:声明三维动态数组,将角标和进行相加并添加到mfc的list中,然后释放内存。
具体代码如下
//声明三维数组,长处分别为X_Length,Y_Length,Z_Length
int X_Length = 5, Y_Length = 6, Z_Length = 7;//长度定义
double ***DD;//声明指针
DD = new double **[X_Length];//定义X的长度
for (int x = 0;x < X_Length; x++)//在X的内部,定义Y
{
DD[x] = new double *[Y_Length];//定义Y的长度
for (int y = 0; y < Y_Length; y++)//在xy的内部,定义Z
{
DD[x][y] = new double [Z_Length];//定义Z的长度
}
}
//数组的声明完成,可以对数组进行操作
//比如将数组的角标的和,并显示在表格中
int count_number = 0;
for (int i = 0;i < X_Length; i++)
{
for (int j = 0; j < Y_Length; j++)
{
for (int k = 0; k < Z_Length; k++)
{
DD[i][j][k] = i + j + k;
CString temp;
m_list.InsertItem(count_number,_T(""));
temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
count_number++;
}
}
}
//用完数组后,用delete将内存释放
for (int x = 0; x < X_Length; x++)
{
for (int y = 0; y < Y_Length; y++)
{
delete [] DD[x][y];//释放Z这一层
}
}
for (int x = 0; x < X_Length; x++)
{
delete [] DD[x];//释放Y这一层
}
delete [] DD;//释放X这一层
在进行生成数组时,一定要弄清楚x、y、z之间的关系。
2. 使用malloc和free来构造
malloc memory中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存
使用思路和new相同,都是先申请内存,然后使用,使用结束后释放内存。
// 用malloc 和 free来生成三维动态数组
int X_Length = 5, Y_Length = 10, Z_Length = 7;//长度定义
double ***DD;//声明指针
DD = (double***)malloc(sizeof(double**)*X_Length);//X的长度
for (int x = 0; x < X_Length; x++)
{
DD[x] = (double **)malloc(sizeof(double*)*Y_Length);//Y的长度
for (int y = 0;y < Y_Length;y++)
{
DD[x][y] = (double *)malloc(sizeof(double)*Z_Length);//Z的长度
}
}
//数组的声明完成,可以对数组进行操作
//比如将数组的角标的和,并显示在表格中
int count_number = 0;
for (int i = 0;i < X_Length; i++)
{
for (int j = 0; j < Y_Length; j++)
{
for (int k = 0; k < Z_Length; k++)
{
DD[i][j][k] = i + j + k;
CString temp;
m_list.InsertItem(count_number,_T(""));
temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
count_number++;
}
}
}
//用完数组后,用free将内存释放
for (int x = 0; x < X_Length; x++)
{
for (int y = 0; y < Y_Length; y++)
{
free(DD[x][y]);//释放Z
}
}
for (int x = 0; x < X_Length; x++)
{
free(DD[x]);//释放Y
}
free(DD);//释放X
3.构造函数来生成数组
从1、2中的例子可以看出,每次使用数组时,需要声明数组和释放内存,操作特别繁琐,因此可以将其写成子函数的形式,来简化操作。
3.1 声明数组函数
double ***CtestdataDlg::Shuzu(int X_Length,int Y_Length,int Z_Length)
{
double ***DD;//声明指针
DD = new double **[X_Length];//定义X的长度
for (int x = 0;x < X_Length; x++)//在X的内部,定义Y
{
DD[x] = new double *[Y_Length];//定义Y的长度
for (int y = 0; y < Y_Length; y++)//在xy的内部,定义Z
{
DD[x][y] = new double [Z_Length];//定义Z的长度
}
}
return DD;
}
3.2 释放内存函数
void CtestdataDlg::DeleteShuzu(double ***DD,int X_Length,int Y_Length,int Z_Length)
{
//用完数组后,用delete将内存释放
for (int x = 0; x < X_Length; x++)
{
for (int y = 0; y < Y_Length; y++)
{
delete [] DD[x][y];//释放Z这一层
}
}
for (int x = 0; x < X_Length; x++)
{
delete [] DD[x];//释放Y这一层
}
delete [] DD;//释放X这一层
}
3.3 应用函数
void CtestdataDlg::OnBnClickedButton3()
{
m_list.DeleteAllItems();
int X_Length = 5, Y_Length = 4, Z_Length = 3;
double ***DD = Shuzu(X_Length,Y_Length,Z_Length);//构造数组
int count_number = 0;
for (int i = 0;i < X_Length; i++)
{
for (int j = 0; j < Y_Length; j++)
{
for (int k = 0; k < Z_Length; k++)
{
DD[i][j][k] = i + j + k;
CString temp;
m_list.InsertItem(count_number,_T(""));
temp.Format(_T("%d"),count_number+1);m_list.SetItemText(count_number,0,temp);
temp.Format(_T("%d"),i);m_list.SetItemText(count_number,1,temp);
temp.Format(_T("%d"),j);m_list.SetItemText(count_number,2,temp);
temp.Format(_T("%d"),k);m_list.SetItemText(count_number,3,temp);
temp.Format(_T("%f"),DD[i][j][k]);m_list.SetItemText(count_number,4,temp);
count_number++;
}
}
}
//释放内存
DeleteShuzu(DD,X_Length,Y_Length,Z_Length);
}
如何在C++中使用动态三维数组的更多相关文章
- 如何在JavaScript中手动创建类数组对象
前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...
- 如何在C中传递二维数组作为参数?
回答: 在C语言中,有很多方法可以将2d数组作为参数传递.在下面的部分中,我描述了将2d数组作为参数传递给函数的几种方法. 使用指针传递2d数组以在c中运行 多维数组的第一个元素是另一个数组,所以在这 ...
- 如何在vue中修改动态标签中的样式和修改组件库样式
vue中修改动态标签中的样式和修改组件库样式 因为vue中的标签在渲染的时候,都会给标签加上id 所以你想在<style lang="scss" scoped>直接修改 ...
- 七、如何在Java中高效检查一个数组是否含有一个值
如何检查一个数组(非排序的)是否包含特定的值.这是个非常有用或经常被在Java中使用.这是个在Stack Overflow中高得票的问题.在已经高得票的答案中,有许多不同的处理方法,但是时间的复杂度非 ...
- Java中的动态定义数组
1.一维矩阵的动态定义(代码注释) 1.1方法一 package dongtai; import java.util.Scanner; import java.util.ArrayList; publ ...
- VBA中如何动态定义数组
利用 dim Arr()as string这样声明,一旦赋值后,数组大小也就固定了.如果要改变数组大小,要用redim 命令redim arr(10) 加preserve 可以不清空数组,保持原有数据 ...
- 如何在vue中使用动态使用本地图片路径
不知道各位小伙伴有没有在开发遇到一个问题,就是在线上的项目使用后台返回本地图片路径,然后加载不上的情况呢? 我的解决方法就是:先在项目的data下定义好这样一个数组用于存放需要加载的路径 [ {nam ...
- 如何在C++中动态建立二维数组(转)
http://blog.sina.com.cn/s/blog_7c073a8d0100qp1w.html http://blog.163.com/wujiaxing009@126/blog/stati ...
- [C] 在 C 语言编程中实现动态数组对象
对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...
随机推荐
- navicat for mysql 12中文破解版(安装+破解)--亲测可用
http://www.ddooo.com/softdown/129457.htm#dltab
- 使用Spark进行搜狗日志分析实例——map join的使用
map join相对reduce join来说,可以减少在shuff阶段的网络传输,从而提高效率,所以大表与小表关联时,尽量将小表数据先用广播变量导入内存,后面各个executor都可以直接使用 pa ...
- JPA + SpringData 操作数据库--Helloworld实例
前言:谈起操作数据库,大致可以分为几个阶段:首先是 JDBC 阶段,初学 JDBC 可能会使用原生的 JDBC 的 API,再然后可能会使用数据库连接池,比如:c3p0.dbcp,还有一些第三方工具, ...
- NGINX 502错误排查(转)
一.NGINX 502错误排查 NGINX 502 Bad Gateway错误是FastCGI有问题,造成NGINX 502错误的可能性比较多.将网上找到的一些和502 Bad Gateway错误有关 ...
- 保存eclipse个人配置的几种方式
本人用eclipse做Java开发之前,往往要设置下eclipse的背景,字体,颜色,以便保护眼睛.但这些数据是放在workspaces里的,一旦新建workspace所有要重新调整,很麻烦,于是尝试 ...
- 关于nginx安装的收藏
http://blog.csdn.net/yuan_xw/article/details/51181282
- random模块用法
最近生病,学习进度少许拖延,, import random # 随机取0~1之间的小数 print(random.random()) # 随机取2数之间的整数 print(random.randint ...
- mysql_pconnect 问题
不同于mysql_connect的短连接,mysql_pconnect持久连接的时候,将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接 ...
- DevOps 开源工具
1. 开发工具 版本控制&协作开发 版本控制系统 Git Git 是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.开源中国 Git 代码托管平台:http:/ ...
- 一个切换内外网IP地址的批处理BAT
做了一个切换内外网的小脚本.没想到这个老的没剩几颗牙的DOS竟然功能如此强大.盛名之下名副其实啊!不亏是想当年叱咤风云的操作系统啊! 脚本内容1.建立两个TXT文件,分别按行存储内外网的IP,MASK ...