ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

可变数组

2022-09-06 16:33:07  阅读:172  来源: 互联网

标签:index return int 数组 可变 array Array size


可变数组

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

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

  • 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
来源: https://www.cnblogs.com/Iguang/p/16662277.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有