C语言之可变数组

        昨天学习了翁恺老师的可变数组,刚听的时候,是比较懵的,但是在自己跟着老师敲了一遍代码之后,才慢慢理解老师的可变数组的内核。

        首先,一个可变数组包括数组的创建,内存的释放,得到数组的大小,访问并修改数组中的某个元素,加上可变数组的生长。

        首先定义一个结构体,该结构体包含数组和其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。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值