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

可变数组

时间:2022-09-06 16:36:16浏览次数:60  
标签: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
From: https://www.cnblogs.com/Iguang/p/16662277.html

相关文章

  • C#:初识结构体、数组、冒泡排序。
    代码:///<summary>///1.结构体与枚举、变量相似,都是自定义一种新的数据的类型///2.结构体中的不称为变量,被称为是字段。,因为变量只可以储存一种数据,字段可以......
  • 10.6 函数参数定义_个数可变的位置形参_个数可变的关键字形参
     deffun(*args):#函数定义时,个数可变的位置参数print(args)fun(10,20,30)#输出结果为元组deffun1(**args):#函数定义时,个数可变的关键字形参......
  • 常用的提高读写效率的数据结构:哈希表,有序数组,搜索树
    哈希表:key-value的存储结构,把值放在数组中,用一个哈希函数把key换算成确定的位置,然后把value放在数组的这个位置,不可避免多个key值经过哈希算法后出现同一个值的情况,处理这......
  • 输入m,n两个参数,获取一个m长度的都是n的数组,不能用循环
    方法一:functioncreatArr(m,n){vararr=[];functionpushArr(m,n){if(arr.length==m){returnarr;}arr.push(n);......
  • 字符串、向量和数组
    C++Primer学习笔记:string、vector、迭代器以及数组,只记录不会或不熟悉的地方博客小站:blog.smartdog.top命名空间std::cin使用标准输入输出命名空间,::域操作符表示......
  • 9月5日——静态方法、数组拷贝、大数值
    带标签的break、continuepublicclassLabeledFor{publicstaticvoidmain(String[]args){inti=0;outer://Can'thavestatementsherefor(;......
  • 二维数组
    二维数组目录二维数组定义二维数组打印一维数组中某一二维数组的元素遍历并打印二维数组定义二维数组二维数组就是在一维数组的嵌套了一层的数组元素,这些元素既是一维......
  • get请求传对象数组参数
    有个请求,里面的参数有对象数组的情况,原来是post请求,后面接口改成get请求,那用axios请求的参数自然也从data改为params。第一次修改后的请求情况是这样的:整个路径......
  • 977 有序数组的平方
    题目977有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例1:输入:nums=[-4,-1,0,3,10]输......
  • 可变参数
    1.定义java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。就可以通过可变参数实现2.基本语法 访问修饰符返回类型方法名(数据类型...形......