C语⾔创建动态数组(动态存储区)
严格来说,C语⾔中并没有直接创建动态数组的⽅法。
不同于别的语⾔,C语⾔不允许⽤ int a[n] (n为变量) 的⽅式定义动态数组,⽽是通过采⽤指针型函数创建动态存储区,继⽽实现动态数组的效果,要使⽤这些函数,需要我们了解指针的⽤法。
在 stdlib 库中提供了 ⼏个创建动态存储区的指针型函数,通过调⽤这些函数,可以让我们实现创建动态数组的效果。
下⾯分别介绍每个函数的使⽤⽅法:
1. void *malloc(unsigned int size)
函数作⽤:开辟⼀个长度为size的连续空间,函数的返回值是所分配区域的第⼀个字节的地址,开辟空间失败返回NULL
形参 size 的类型定义为⽆符号类型,表⽰开辟空间的长度
要注意该指针的基类型是void,即不指向任何类型的数据。
# include<stdio.h>
/*
前已说明该函数是由stdlib库提供的
即在stdlib.h的头⽂件中声明的
因此使⽤前要把stdlib.h头⽂件包含到程序⽂件中
*/
# include<stdlib.h>
int main(){
const int N =5;
int i,j,*p;
// 创建⼀个长度N*sizeof(int)的空间,可以理解为动态数组int a[N]
/
/ 将地址转换成int * 型,可以省略,因为操作系统会⾃动进⾏转化
// 即 int *p = malloc(N*sizeof(int));这样定义也是没有问题的
p =(int*)(malloc(N*sizeof(int)));
// 数组初始化
for(i=0;i<N;i++)
*(p+i)= i+1;
printf("The array (made by malloc) : \n");
for(i=0;i<N;i++)
printf("%-4d",*(p+i));
printf("\n");
return0;
}
2. void *calloc(unsigned n,unsigned size)
函数作⽤:要开辟n个长度为size的连续空间。函数的返回值是所分配区域的第⼀个字节的地址,开辟空间失败返回NULL
形参n的类型定义为⽆符号类型,表⽰长度为size的空间的个数
形参 size 的类型定义为⽆符号类型,表⽰开辟空间的长度
calloc函数开辟的空间⽐较⼤,可以为⼀维数组开辟动态存储空间,其中n维元素个数,每个元素长度为size
# include<stdio.h>
/*
前已说明该函数是由stdlib库提供的
即在stdlib.h的头⽂件中声明的
因此使⽤前要把stdlib.h头⽂件包含到程序⽂件中
*/
# include<stdlib.h>
int main(){
molloc函数const int N =5;
int i,j,*p;
// 创建⼀个长度N*sizeof(int)的空间,可以理解为动态数组int a[N]
// 将地址转换成int * 型,可以省略,因为操作系统会⾃动进⾏转化
// 即 int *p = calloc(N,sizeof(int));这样定义也是没有问题的
p =(int*)(calloc(N,sizeof(int)));
// 数组初始化
for(i=0;i<N;i++)
*(p+i)= i+1;
printf("The array (made by calloc) : \n");
for(i=0;i<N;i++)
printf("%-4d",*(p+i));
printf("\n");
return0;
}
3. void *realloc(void *p,unsigned int size)
该函数的作⽤:对于那些使⽤malloc、calloc函数开辟的动态控件,如果想要改变空间⼤⼩,可以使⽤该函数重新分配。参数p 是void类型的指针变量,要指向⼀个动态存储区
形参 size 的类型定义为⽆符号类型,⽰开辟空间的长度
# include<stdio.h>
/*
前已说明该函数是由stdlib库提供的
即在stdlib.h的头⽂件中声明的
因此使⽤前要把stdlib.h头⽂件包含到程序⽂件中
*/
# include<stdlib.h>
int main(){
const int N =5;
int i,j,*p;
// 创建⼀个长度N*sizeof(int)的空间,可以理解为动态数组int a[N]
/
/ 将地址转换成int * 型,可以省略,因为操作系统会⾃动进⾏转化
// 即 int *p = malloc(N*sizeof(int));这样定义也是没有问题的
p =(int*)(malloc(N*sizeof(int)));
// 数组初始化
for(i=0;i<N;i++)
*(p+i)= i+1;
printf("The array (made by malloc) : \n");
for(i=0;i<N;i++)
printf("%-4d",*(p+i));
// 使⽤realloc函数重新分配动态存储区
p =(int*)(realloc(p,6*sizeof(int)));
/
/ 数组初始化
for(i=0;i<6;i++)
*(p+i)= i+1;
printf("\n");
printf("The array (modified by realloc): \n");
for(i=0;i<6;i++)
printf("%-4d",*(p+i));
printf("\n");
return0;
}
4. void free(void *p)
函数作⽤:释放指针p所指向的动态空间。
参数p 是void类型的指针变量,要指向⼀个动态存储区
该函数 意如其名,便不⽤代码演⽰,读者可⾃⼰上机操作。
总结:C语⾔中定义动态数组的⽅法归根到底来说还是操作指针,通过指针型函数创建⼀个连续的动态存储区,⽤指针变量指向该存储区的第⼀个字节的地址,进⽽进⾏操作,有点类似于将⼀个数组名赋给⼀个指针变量,继⽽操作数组。所以,理解并掌握指针,是学习C语⾔的必经之路!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论