`
默默pig
  • 浏览: 53353 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

动态数组

 
阅读更多

动态数组


定义:
利用“指针”和“内存空间分配函数”,根据用户的需求,动态且恰当地利用内存空间。

优点:
能够有效地利用内存空间。

缺点:
创建方式麻烦,使用时易混淆,且最后需要释放内存空间(否则易造成内存泄漏,而数组不用)。

使用原则:
1. 创建需从外到里。
2. 释放需从里到外。(释放指针所指向的空间,free函数接受的参数是指针)

使用方法:
以三维数组int array[n1][n2][n3]={0}为例,其对应的动态数组的创建如下:
int n1,n2,n3,i,j,k;
int ***array;       //创建一个动态的三维数组需声明一个三维指针array。
/*创建从外到里*/
array = (int***)calloc(n1,sizeof(int**));
for(i=0;i<n1;i++)
{
array[i] = (int**)calloc(n2,sizeof(int*));
for(j=0;j<n2;j++)
{
array[i][j]=(int*)calloc(n3,sizeof(int));
/*此层循环是初始化动态数组(为数组赋值),而外两层是为动态数组分配内存空间。*/
for(k=0;k<n3;k++)   
array[i][j][k]=0;    //array[i][j][k]存储的是一个int值
}
}

/*释放从里到外*/
for(i=0;i<n1;i++){
for(j=0;j<n2;i++)
free(array[i][j]);
free(array[i]);
}
Free(array);

以二维数组int array[n1][n2]={0}为例,其对应的动态数组创建如下:
int n1,n2,i,j;
int** array;      //创建一个动态的二维数组需要声明一个二维指针array。
array=(int**)calloc(n1,sizeof(int*));
for(i=0;i<n1;i++)
{
array[i]=(int*)calloc(n2,sizeof(int));
for(j=0;j<n2;j++)
array[i][j]=0;
}
/*释放从里到外*/
for(i=0;i<n1;i++)
free(array[i]);
free(array);

以一维数组int array[n1]=0为例,其对应的动态数组创建如下:
int n1,i;
int* array;    //创建一个动态的一维数组需要声明一个一维指针array。
/*创建从外到里*/
array=(int*)calloc(n1,sizeof(int));
for(i=0;i<n1;i++)
array[i]=0;

/*释放从里到外*/
free(array);


思考:
1. 指针和数组的区别。

2.声明和定义的区别。
声明只是创建了某个类型的变量,并且告知编译器。而定义是在声明的基础上,还为变量分配内存空间。所以创建一个数组不能说声明一个数组,而应该说定义一个数组。
3. malloc和calloc的使用。
同:都能分配内存空间,并返回一个指针(地址),函数头都是<stdlib.h>。
异:
1.malloc只能接受一个参数,calloc接受两个参数,但使用效果可以相同。如: malloc(num*sizeof(type))和calloc(num,sizeof(type));
    2.当成功分配内存空间时,calloc首先会将内存空间存储的值初始化为0,而malloc不会。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics