其他分享
首页 > 其他分享> > 可变数组

可变数组

作者:互联网

可变数组

上完翁恺老师的可变数组后发现并不是很理解,但是跟着敲了一遍,也有些许的感觉,下面就记录一下

首先我们的确定可变数组需要些什么函数:

先定义一个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
来源: https://www.cnblogs.com/Iguang/p/16662277.html