可变数组
上完翁恺老师的可变数组后发现并不是很理解,但是跟着敲了一遍,也有些许的感觉,下面就记录一下
首先我们的确定可变数组需要些什么函数:
- 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);
先定义一个Array,Array是一个结构,里面有两个成员:整型指针array和整型变量size:
typedef struct{
int* array;
int size;
}Array;
创建函数:首先声明一个Array类型的变量,将传入的size赋给变量里的size,然后利用这个size创建一个动态内存,因为是整型的,所以需要整型的字节数乘上需要的大小,最后返回一个Array类型的变量
Array array_create(int init_size)
{
Array a;
a.size = init_size;
a.array = (int*)malloc(sizeof(int)*a.size);
return a;
}
内存释放函数:就利用free()将a里的array给处理掉
void array_free(Array* a)
{
free(a->array);
a->array = NULL;
a->size = 0;
}
获取数组大小函数:直接返回一个a里的size
int array_size(const Array* a)
{
return a->size;
}
获取在index位置上的东西:直接返回一个a->array的指针
int* array_at(Array* a, int index)
{
return &(a->array[index]);
}
小剧场:*array_at(&a, 0)可以直接赋值,有没有觉得很神奇,如果你看着这个东西感觉很抽象的话,下面将介绍两个函数(这两个写多面向对象很是熟悉)
int array_get(const Array* a, int index)
{
return a->array[index];
}
void array_set(Array* a, int index, int value)
{
return array_at(&a, 0, 10);
}
自动增长函数
void array_inflate(Array* a, int more_size)
{
int* p = (int*)malloc(sizeof(int)*(a->size+more_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;
}
经过上面的学习,可变数组的大致逻辑已经清楚,接下来加点比较难理解的东西
//先定义一个常量
const BLOCK_SIZE = 20;
//或者
#define BLOCK_SIZE 20
//接下来修改一下array_at函数,如果拿正常的思路来修改,每次只能一个一个增长,所以引入BLOCK_SIZE,使得每次可以一次性的增加固定的数量
int* array_at(Array* a, int index)
{
if(index >= a->size)
{
array_inflate(&a, (index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size)
}
return &(a->array[index]);
}
main()里的代码
Array a = array_create(100);
printf("%d\n", array_size(&a));
//*array_at(&a, 0) = 10;
//printf("%d\n", *array_at(&a, 0));
array_set(&a, 0, 10);
printf("%d\n", array_get(&a, 0));
int number;
int cnt = 0;
while (number != -1)
{
scanf_s("%d\n", &number);
if (number != -1)
*array_at(&a, cnt++) = number;
//scanf_s("%d", array_at(&a, cnt++));
}
array_free(&a);
return 0;
标签:index,return,int,数组,可变,array,Array,size
From: https://www.cnblogs.com/Iguang/p/16662277.html