二维数组的动态使用(记录)(附上一段自己的代码)
2013-05-17 10:53
337 查看
|字号 订阅
常规的方法当然就是a[][]方式,这里主要介绍另外两种方法:
方法一:
const int ROW = 3;
int size = 5;
int (*pi)[ROW] = new int[size][ROW];//注意不要写成int (pi*)[ROW]
操作方法:
for ( i=0; i<ROW; ++i )
{
for ( int j=0; j<size; ++j )
{
pi[i][j] = k++;//初始化
cout <<setw(2) <<pi[i][j] <<' ';//输出
}
cout <<endl;
}
内存释放:
delete[] pi;
pi=NULL;
缺点:ROW必须是已知。
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)。
方法二:
使用指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组:
定义:
int **b=new int*[row]; //分配一个指针数组,将其首地址保存在b中
for(i=0;i<row;i++) //为指针数组的每个元素分配一个数组
b[i]=new int[col];
操作方法:
for ( i=0; i<row; ++i )
{
for ( int j=0; j<col; ++j )
{
b[i][j] = k++;//初始化
cout <<setw(2) <<b[i][j] <<' ';//输出
}
cout <<endl;
}
内存释放:
for(i=0;i<row;i++)
{
delete [col] b[i];
b[i]=NULL;
}
delete [row] b;
b=NULL;
缺点:非连续储存,内存释放烦琐,双重指针。
优点:调用直观, row,col可以不是已知。
该方法定义的动态二维数组的释放需先释放指针数组每个元素指向的数组,然后再释放该指针数组。
方法三:
同样是使用指针数组,然后使每一个指针元素指向一个数组,与方法二类似,写法不同:
int *matrix[5];
for(int i=0;i<5;i++)
{
matrix[i]=new int[5];
for(int j=0;j<5;j++)
{
matrix[i][j]=i+j;
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
内存释放:
for(int i=0;i<5;i++)
delete[] matrix[i];
cout<<endl;
注:
数组指针:int *a[5]它是一个含有5个整形指针元素的数组,它含有5个指针;
int (*a)[5]则表示它是一个指向含有5个元素的数组的指针,即它一个指针,如果是二维数组,则它必须含有5列;三维的则需要后两维也相同,如:int (*matri)[5][6]=new int[4][5][6]; 后面的两维必须相同。
我自己的代码,学习中。。。
常规的方法当然就是a[][]方式,这里主要介绍另外两种方法:
方法一:
const int ROW = 3;
int size = 5;
int (*pi)[ROW] = new int[size][ROW];//注意不要写成int (pi*)[ROW]
操作方法:
for ( i=0; i<ROW; ++i )
{
for ( int j=0; j<size; ++j )
{
pi[i][j] = k++;//初始化
cout <<setw(2) <<pi[i][j] <<' ';//输出
}
cout <<endl;
}
内存释放:
delete[] pi;
pi=NULL;
缺点:ROW必须是已知。
优点:调用直观,连续储存,程序简洁(经过测试,析构函数能正确调用)。
方法二:
使用指针,分配一个指针数组,将其首地址保存在b中,然后再为指针数组的每个元素分配一个数组:
定义:
int **b=new int*[row]; //分配一个指针数组,将其首地址保存在b中
for(i=0;i<row;i++) //为指针数组的每个元素分配一个数组
b[i]=new int[col];
操作方法:
for ( i=0; i<row; ++i )
{
for ( int j=0; j<col; ++j )
{
b[i][j] = k++;//初始化
cout <<setw(2) <<b[i][j] <<' ';//输出
}
cout <<endl;
}
内存释放:
for(i=0;i<row;i++)
{
delete [col] b[i];
b[i]=NULL;
}
delete [row] b;
b=NULL;
缺点:非连续储存,内存释放烦琐,双重指针。
优点:调用直观, row,col可以不是已知。
该方法定义的动态二维数组的释放需先释放指针数组每个元素指向的数组,然后再释放该指针数组。
方法三:
同样是使用指针数组,然后使每一个指针元素指向一个数组,与方法二类似,写法不同:
int *matrix[5];
for(int i=0;i<5;i++)
{
matrix[i]=new int[5];
for(int j=0;j<5;j++)
{
matrix[i][j]=i+j;
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
内存释放:
for(int i=0;i<5;i++)
delete[] matrix[i];
cout<<endl;
注:
数组指针:int *a[5]它是一个含有5个整形指针元素的数组,它含有5个指针;
int (*a)[5]则表示它是一个指向含有5个元素的数组的指针,即它一个指针,如果是二维数组,则它必须含有5列;三维的则需要后两维也相同,如:int (*matri)[5][6]=new int[4][5][6]; 后面的两维必须相同。
我自己的代码,学习中。。。
int strLen = strlen(itemText)+1; char tmpBuf[24]; memset(tmpBuf,0,24); memcpy(tmpBuf,itemText,strLen); int offset = 0 ; char (*tmpChr)[6] = new char[24][6]; int j = 0 ; for (int i = 0; i < strLen ; i++) { if (tmpBuf[i] == '-' || tmpBuf[i] == ' ' || tmpBuf[i] == ':' || tmpBuf[i] == '\0') { memset(tmpChr[j],0,24); memcpy(tmpChr[j],tmpBuf+offset,i-offset); offset = i+1; j++; } } req->StartTime.year = atoi(tmpChr[0]); req->StartTime.month = atoi(tmpChr[1]); req->StartTime.day = atoi(tmpChr[2]); req->StartTime.hour = atoi(tmpChr[3]); req->StartTime.minute = atoi(tmpChr[4]); req->StartTime.sec = atoi(tmpChr[5]); if (tmpChr) { delete []tmpChr; tmpChr= NULL; }
相关文章推荐
- 网页上记录鼠标的点击次数和一段有用的php代码,自己学习使用
- 用PHP写一段代码,实现不使用第3个变量,交换$a、$b的值,$a、$b的初始值自己定。(五种方法实现)
- 分享一段JS代码,个人感觉很使用:网页浏览历史记录
- java使用动态代理来实现AOP(日志记录)的实例代码
- java使用动态代理来实现AOP(日志记录)的实例代码
- 记录eclipse 外部导入的工程无法使用自己定义的代码风格问题
- 记录一段使用socket 回复的http json的请求代码
- 分享一段JS代码,个人感觉很使用:网页浏览历史记录
- 使用动态代理记录方法执行的时间
- Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用
- 一段上传图片,并在MYSQL中记录路径的代码求指正
- 简单使用Git和Github来管理自己的代码和读书笔记
- 使用代码动态添加、删除view,通过tag寻找控件
- [置顶] 关于时下热门的《阿里百川HotFix》自己写了个小测试记录以便下次使用
- 使用jQuery的.on()为程序动态添加的代码添加事件
- Style样式的四种使用(包括用C#代码动态加载资源文件并设置样式)
- 动态代码的使用(反射和动态生成类)
- 使用T4Scaffolding 创建自己的代码生成
- 分享一段自己写的Linux 驱动调试寄存器的代码
- 使用proguard.cfg工具来混淆代码后,自己的项目出了好些问题