可变数组(创建,回收,计算可用空间,访问,数组空间扩大)

#include<stdio.h>
#include<stdio.h>
#include<stdlib.h>

const BLOCK_SIZE=20;//一次增长20个 
typedef struct{
	int *array;
	int size;
}Array;//先定义array,定义一个结构,有两个成员。:一个成员是int数组,其实是指针
 void f()//void表示返回空值,f是函数名
 {
 	Array a;//是个本地变量 
 }
 /*
 typedef(struct{
 int *array;
 int size;
}* )Array; 括号里的是Array,而这个东西是指针 
Array a;//a是指针,下面的*可以去掉 
 */ 
Array array_creat(int init_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);
/*为什么用Array而不是Array* 
② 这种方式,让它返回一个结构体,使我们在外面可以比较灵活方式使用,array_creat制造的Array a 
*/
Array array_creat(int init_size){//Array 说明了返回类型 ,返回Array的是本地变量本身 
	Array a; //①使用Array*会使array a无效 
	a.array=(int*)malloc(sizeof(int)*init_size);
	a.size=init_size;
	return a;
}

 
 Array array_free(Array *a){
 	free(a->array);
 	a->array=NULL;
	a->size=0; 
 }
//封装 
int array_size(const Array *a){
	 
	return a->size;//:把a的size保护起来 
}

int* array_at(Array *a,int index){//返回类型是指针 //具有自动增长的功能 
	if(index>=a->size){
	 	array_index(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);//算出位于哪个BLOCK里面,+1,找到序号 
	 }
	return &(a->array[index]);//为什么返回指针,而不是int 
}
/*
int array_get(const Array*a,int index)
{
return a->array[index]; 
}
int array_set(Array*a,int index,int value)
{
a->array[index]=value;
}
*///下面改成get和set
 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];
 }
 //代替for循环推荐使用:
 //memcpy((void*)p,(void*)a->array,a->size*sizeof(int));
 	free(a->array);
 	a->array=p;
 	a->size+=more_size; 
 }


int main(int argc,char const *argv[])
{
	Array a=array_creat(100);//a是存在于main本地的,所有的变量/成员是从array_creat里面返回出来的a里面的所有成员 
	printf("%d\n",array_size(&a));
	printf("%d\n",a.size);
*array_at(&a,0) =10;//函数调用返回的是一个指针,加*,指针所指的那个东西,是个变量 
	printf("%d\n",*array_at(&a,0));
	int numer;
	int cnt=0;//计数器 
	while(numer!=-1){
	//1	scanf("%d",&numer);
	//2	*array_at(&a,cnt++)=numer;
		scanf("%d",array_at(&a,cnt++));//array_at(&a,cnt++)指针
		//1+2于之有同样的效果 
		if(numer!=-1)
		*array_at(&a,cnt++)=numer;
	}
	array_free(&a);
	
	return 0;
 } 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值