C++数组(一维、二维、三维)的动态分配new、初始化memset和释放delete
2014-07-03 19:07
357 查看
【原文】http://blog.csdn.net/shanzhizi/article/details/7835752
数组的动态分配、初始化和释放经常用到,这里总结一下,尤其是二维数组
动态分配: int *array=new int
;
初始化:memset(array,0,n*sizeof(array)); (也可以利用一个for循环对其赋值初始化)
撤销:delete [] array;
动态分配:
二维数组(n行m列)利用new来进行动态分配实际上相当于对n个m元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来进行这项操作。MSVC目前还没有这般的人性化,具体应该这样做:
初始化:
如果把一维数组初始化办法照搬过来就会发现对于动态分配的二维数组并不适用。这就要理解到memset这个函数三个参数的含义。MSDNhttp://blog.csdn.net/shanzhizi对memset的描述如下:
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );
可见memset只能作用于一个一维数组void *dest,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。我的理解是memset只作用于一块连续的内存空间,而动态开辟的空间不一定是连续的,所以具体写法如下:
撤销:
数组的动态分配、初始化和释放经常用到,这里总结一下,尤其是二维数组
一维数组
一维数组的动态分配,初始化和撤销都好说,几乎每一本C++教材都会做出详细的说明。具体如下:动态分配: int *array=new int
;
初始化:memset(array,0,n*sizeof(array)); (也可以利用一个for循环对其赋值初始化)
撤销:delete [] array;
二维数组
下面来说二维数组的。动态分配:
二维数组(n行m列)利用new来进行动态分配实际上相当于对n个m元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来进行这项操作。MSVC目前还没有这般的人性化,具体应该这样做:
int **array; array=new int *[10]; for(int i=0;i<10;i++) array[i]=new int [5];上面的操作完成了一个10行5列的二维数组array[10][5]的动态分配,可以看到我们先动态分配了一个10单元的数组的指针的指针的首地址给**array,然后再对其每个首地址进行遍历,同时完成一个5单元的数组的动态分分配,并把首地址给*array[i],从而最终完成了二维数组array[10][5]的动态分配。我们可以依此类推得到三维以至多维的数组的动态分配方法。
初始化:
如果把一维数组初始化办法照搬过来就会发现对于动态分配的二维数组并不适用。这就要理解到memset这个函数三个参数的含义。MSDNhttp://blog.csdn.net/shanzhizi对memset的描述如下:
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );
可见memset只能作用于一个一维数组void *dest,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。我的理解是memset只作用于一块连续的内存空间,而动态开辟的空间不一定是连续的,所以具体写法如下:
int **array; array=new int *[10]; for(int i=0;i<10;i++) { array[i]=new int [5]; memset(array[i],0,5*sizeof(int)); //注意这里是array[i] }可以看到这里的memset的第三个参数有了变化。
撤销:
for (int i = 0; i < 10; i ++) { delete[] array[i]; } delete [] array;
三维数组
类似于二维数组,用一个例子说明:#include <stdio.h> #include <memory.h> #define size1 5 #define size2 10 #define size3 15 int main() { int *** arr; int i,j,k; /////////////////// 动态开辟 相当于arr[size1][size2][size3] arr = new int**[size1]; for (i = 0; i < size1; i ++) { arr[i] = new int*[size2]; for (j = 0; j < size2; j ++) { arr[i][j] = new int[size3]; } } /////////////////// 用for循环初始化 for (i = 0; i < size1; i ++) { for (j = 0; j < size2; j ++) { for (k = 0; k < size3; k ++) { arr[i][j][k] = i * j * k; } } } for (i = 0; i < size1; i ++) { for (j = 0; j < size2; j ++) { for (k = 0; k < size3; k ++) { printf("i*j*k=%d*%d*%d=%d/n",i,j,k,arr[i][j][k]); } } } /////////////////// 用memset,如果是静态int arr[][][]的话,直接memset(arr,0,sizeof(arr));数组初始化为0 for (i = 0; i < size1; i ++) { for (j = 0; j < size2; j ++) { memset(arr[i][j],-1,sizeof(int) * size3); } } for (i = 0; i < size1; i ++) { for (j = 0; j < size2; j ++) { for (k = 0; k < size3; k ++) { printf("i,j,k=%d,%d,%d=%d/n",i,j,k,arr[i][j][k]); } } } ///////////////////// 释放内存 for (i = 0; i < size1; i ++) { for (j = 0; j < size2; j ++) { delete[] arr[i][j]; } delete[] arr[i]; } delete[] arr; return 0; }
相关文章推荐
- C++数组的动态分配(new)、初始化(memset)和撤销(delete)
- 二维数组的动态分配(new)、初始化(memset)和撤销(delete)
- 二维数组的动态分配(new)、初始化(memset)和撤销(delete)
- 数组的动态分配(new)、初始化(memset)和撤销(delete)
- C++之动态空间分配与释放:new & delete
- 动态内存分配(new)和释放(delete)
- C++:多维数组的动态分配(new)和释放(delete)
- C++:多维数组的动态分配(new)和释放(delete)
- 实现动态分配一维,二维,三维数组
- 一维静态指针和一维new分配的动态指针,均不可以delete.
- 动态分配内存 and malloc&new and 数组的动态分配、初始化(memset)和撤销(delete)
- C++:多维数组的动态分配(new)和释放(delete)
- 三维数组的动态分配与回收(一维、二维都有)
- C++中一维,二维动态数组的建立,与内存的释放delete 和 delete[] 的使用
- C++:多维数组的动态分配(new)和释放(delete)
- C++:多维数组的动态分配(new)和释放(delete)
- C++:多维数组的动态分配(new)和释放(delete)
- C++ 二维数组/多维数组的动态分配(new)和释放(delete)
- 第十五周 项目3:(2)用new和delete运算符进行动态分配的撤销存储空间
- C语言的二维和三维动态连续数组分配