c语言——可变数组
我们知道c语言的数组是固定大小的,一旦被定义将在使用的过程中无法增加其单元大小。
那么,怎么建立一个可变数组呢?
可变数组的要求
- 数组单元可以增加的
- 我能知道目前数组的单元数是多少
- 能够访问到其中的单元
步骤
- 确定子函数
Array array_creat(int int_size);//创建一个数组(Array是一个结构体)
array_free(Array *a);//清空数组空间
int array_size(const Array *a);//获取数组单元
int* array_at(Array *a,int index)//获取数组中的某个单元
void array_inflate(Array *a,int more_size);//增加数组单元
- 定义结构体
typedef struct{
int *array;
int size;
}Array;
- 编写创建一个数组。
核心内容:分配目前的地址空间
/*
输入:数组的大小
输出:结构体:包含数组的首地址和数组单元数
*/
Array array_creat(int int_size)//创建一个数组(Array是一个结构体)
{
Array a;
a.array=(int*)(malloc(sizeof(int)*int_size));//定义空间大小
a.size=int_size;
return a;//返回一个结构体
}
- 编写清空数组
核心内容:清空创建的给数组分配的地址空间
/*
输入:数组结构体
输出:无
*/
void array_free(Array *a)//清空数组空间
{
free(a->array);
a->array=NULL;
a->size=0;
}
- 获取数组单元数
之所以一句话也做成一个函数,是因为方便以后扩展
/*
输入:数组结构体
输出:无
*/
int array_size(const Array *a)//获取数组单元
{
return a->size;
}
- 获取数组中的某个单元
实现对数组单元的读入读出
int* array_at(Array *a,int index)//获取数组中的某个单元
{
return &(a->array[index]);
}
- 增加数组单元
核心内容:重新分配一块地址空间,把以前空间里面的数复制到新的空间里
void array_inflate(Array *a,int more_size)//增加数组单元
{
int *p;
int i;
p=(int*)malloc((a->size+more_size)*sizeof(int));
for(i=0;i<a->size;i++)
{
p[i]= (a->array)[i];
}
free(a->array);
a->array=p;
a->size+=more_size;
}
- 检验代码
#include <stdio.h>
#include <stdlib.h>
#include"arry.h"
int main(int argc, char *argv[])
{
Array a=array_creat(100);//创造一个100的数组
int num=0;
printf("目前数组的大小:%d\n",array_size(&a));//读取当前数组的大小
*array_at(&a,num)=1;//给第0个单元写1
printf("第%d个数组单元的值:%d\n",num,*array_at(&a,num));//读取第0个单元
array_inflate(&a,50);//增加50个单元数
printf("目前数组的大小:%d\n",array_size(&a));//读取当前数组的大小
num=149;
*array_at(&a,num)=num;//给第149个单元写149
printf("第%d个数组单元的值:%d\n",num,*array_at(&a,num));//读取第149个单元
num=0;
printf("第%d个数组单元的值:%d\n",num,*array_at(&a,num));//检验第0个单元是否有变化
array_free(&a);
return 0;
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4aYKGoK-1582108668303)(E:\图片\image-20200217145914497.png)]
由结果可以知道,数组单元有100个扩展到150个。扩展之前单元里面的值也保留存在。
否有变化
array_free(&a);
return 0;
}
结果:
![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8xcXRnYUhpYVU3YU9OdWpUSUxBM3ppY0NVMGljVUJIWDdjSW9yZXNUdTZySHJMOU9nQlBxYnF5RWljckUxMFl6eUplZTY2OFZ0YzFKaWFWZzVpY3d2Q044ajU4US82NDA?x-oss-process=image/format,png)
**由结果可以知道,数组单元有100个扩展到150个。扩展之前单元里面的值也保留存在。**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200219183947691.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMjYyMzU3,size_16,color_FFFFFF,t_70)