昨天学习了翁恺老师的可变数组,刚听的时候,是比较懵的,但是在自己跟着老师敲了一遍代码之后,才慢慢理解老师的可变数组的内核。
首先,一个可变数组包括数组的创建,内存的释放,得到数组的大小,访问并修改数组中的某个元素,加上可变数组的生长。
首先定义一个结构体,该结构体包含数组和其array
#include<stdio.h>
#define BLOCK 20
typedef struct {
int *array;
int size;
}Array;
其次是函数的声明
Array array_create(int init_size);
void 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);
再其次就是完善各部分代码
首先是数组的创建,需要用到动态内存分配,结合所需要的size,来创建一个数组
Array array_create(int init_size)//数组的创建
{
Array a;//创建名为a的Array类型的结构体
a.size=init_size;
a.array=(int *)malloc(sizeof(int)*a.size);
return a;
}
再然后就是内存的释放、得到数组的大小 比较简单
void array_free(Array *a);
{
free(a->array);
a->array=NULL;
a->size=0;
}
int array_size(Array *a)
{
return a->size;
}
在然后是进行该数组的访问和修改
int *array_at(Array *a,int index)
{
if(a->size<=index)
array_inflate(a,(index/BLOCK+1)*BLOCK-a->size);
return &a(a->array[index]);
}
这里面需要注意的是array_at的返回需要是一个指针,如此便可以做到修改
即*array_at(&array, 30)=30;这里将array数组的第30个元素修改为了30;
下一段便是代码的核心部分,数组的生长。简单描述就是将先申请一块新的内存,大小为a.size+=more_size,然后将原来数组的元素一一拷贝到新生成的数组中,再释放原来数组的内存,然后让新的数组指向新定义的p
void array_inflate(Array *a,int more_size)
{
int *p=(int *)malloc(sizeof(int)*(more_size+a->size));
int i;
for(i=0;i<a->size;i++)//将之前的值逐一拷贝
{
p[i]=a->array[i];
}
free(a->array);
a->array=p;
a-size+=more_size;
}
到这里,一个可变数组的创建就基本完成了。
不得不说,翁恺老师真的是yyds。