可变数组

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BLOCK_SIZE 20//每次数组满时,补增多少空间
typedef struct {
  int *array;
  int size;
} Array;

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_create(int init_size){
  Array a;//定义一个结构体变量
  a.size = init_size;
  a.array = (int *)malloc(sizeof (int) * init_size);//让结构体中的指针指向分配好的内存空间
  return a;//返回一个结构体
}
void array_free(Array *a){//形参为结构体指针,指向结构体
  free(a->array);//释放申请的空间
  a->array = NULL;
  a->size = 0;   //令a->size = 0;
}
// 封装
int array_size(const Array *a){//形参为指针要传& 或者 指针
  return a->size;
}
int* array_at(Array *a, int index){
  if ( index >= a->size){
    array_inflate(a, (index / BLOCK_SIZE + 1) * BLOCK_SIZE - a->size);//index可以理解为当前数组的长度/BLOCK_SIZE要几个
  }
  return &(a->array[index]);//这里的函数返回值为指针,所以要加地址运算符;指针可以做数组名使用,因为指针的地址是数组元素的首地址;
}
/* 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;//将数组的size增加
} */

void array_inflate(Array *a , int moresize){
  int *p = (int *)malloc(sizeof(int) * (a->size + moresize));
  memcpy(p, a->array, sizeof(int));//memcpy函数使用:函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中。
  free(a->array);
  a->array = p;
  a->size += moresize;
}

int main()
{
  Array a = array_create(1);//向内存申请空间
  printf("initalized array->size = %d\n", array_size(&a));
  int number = 0;
  int cnt = 0;
  while(number != -1){
    scanf("%d", &number);
    if(number != -1){
      *array_at(&a, cnt) = number;
      printf("a->size = %d a->array[%d]= %d\n",array_size(&a),cnt,*array_at(&a, cnt));
      cnt++;
    }
  }
  array_free(&a);//将a结构体的地址传给函数
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值