可变数组

c语言——可变数组

​ 我们知道c语言的数组是固定大小的,一旦被定义将在使用的过程中无法增加其单元大小。

那么,怎么建立一个可变数组呢?

可变数组的要求

  1. 数组单元可以增加的
  2. 我能知道目前数组的单元数是多少
  3. 能够访问到其中的单元

步骤

  1. 确定子函数
Array array_creat(int int_size);//创建一个数组(Array是一个结构体)
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);//增加数组单元
  1. 定义结构体
typedef struct{
    int *array;
    int size;
}Array; 
  1. 编写创建一个数组。

核心内容:分配目前的地址空间

/*
输入:数组的大小
输出:结构体:包含数组的首地址和数组单元数
*/
Array array_creat(int int_size)//创建一个数组(Array是一个结构体)
{
	Array a;
	a.array=(int*)(malloc(sizeof(int)*int_size));//定义空间大小
	a.size=int_size;
	return a;//返回一个结构体 
}
  1. 编写清空数组

核心内容:清空创建的给数组分配的地址空间

/*
输入:数组结构体
输出:无
*/
void array_free(Array *a)//清空数组空间
{
	free(a->array);
	a->array=NULL;
	a->size=0;
}
  1. 获取数组单元数

之所以一句话也做成一个函数,是因为方便以后扩展

/*
输入:数组结构体
输出:无
*/
int array_size(const Array *a)//获取数组单元
{
	return a->size;
}
  1. 获取数组中的某个单元

实现对数组单元的读入读出

int* array_at(Array *a,int index)//获取数组中的某个单元
{
	return &(a->array[index]);
}
  1. 增加数组单元

核心内容:重新分配一块地址空间,把以前空间里面的数复制到新的空间里

void array_inflate(Array *a,int more_size)//增加数组单元 
{
	int *p;
	int i;
	p=(int*)malloc((a->size+more_size)*sizeof(int));
	for(i=0;i<a->size;i++)
	{
		p[i]= (a->array)[i];
	
	}
	free(a->array);
	a->array=p;
	a->size+=more_size;
}
  1. 检验代码
#include <stdio.h>
#include <stdlib.h>
#include"arry.h"
int main(int argc, char *argv[])
{
	Array a=array_creat(100);//创造一个100的数组 
	int num=0;
	printf("目前数组的大小:%d\n",array_size(&a));//读取当前数组的大小 
	*array_at(&a,num)=1;//给第0个单元写1 
	printf("第%d个数组单元的值:%d\n",num,*array_at(&a,num));//读取第0个单元 
	array_inflate(&a,50);//增加50个单元数 
	printf("目前数组的大小:%d\n",array_size(&a));//读取当前数组的大小 
	num=149;
	*array_at(&a,num)=num;//给第149个单元写149 
	printf("第%d个数组单元的值:%d\n",num,*array_at(&a,num));//读取第149个单元 
	num=0;
	printf("第%d个数组单元的值:%d\n",num,*array_at(&a,num));//检验第0个单元是否有变化 
	array_free(&a);
	return 0;
}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4aYKGoK-1582108668303)(E:\图片\image-20200217145914497.png)]

由结果可以知道,数组单元有100个扩展到150个。扩展之前单元里面的值也保留存在。

否有变化
array_free(&a);
return 0;
}


结果:

![在这里插入图片描述](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy8xcXRnYUhpYVU3YU9OdWpUSUxBM3ppY0NVMGljVUJIWDdjSW9yZXNUdTZySHJMOU9nQlBxYnF5RWljckUxMFl6eUplZTY2OFZ0YzFKaWFWZzVpY3d2Q044ajU4US82NDA?x-oss-process=image/format,png)

**由结果可以知道,数组单元有100个扩展到150个。扩展之前单元里面的值也保留存在。**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200219183947691.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMjYyMzU3,size_16,color_FFFFFF,t_70)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值