学习笔记:可变数组。

这篇博客介绍了如何使用C语言实现动态数组,包括创建、访问、扩容、释放等操作。核心函数包括array_create用于初始化数组,array_free用于释放内存,array_size获取数组大小,array_at访问指定位置元素,array_inflate动态扩容。示例代码展示了这些功能的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*函数: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 index);//使数组的大小增大
*/ 

#include<stdio.h>
#include<stdlib.h>
#include<array.h>
#define BLOCK 20
typedef struct{
    int *array;
    int size;
}Array;//可用此结构定义一个可变数组(实际上Array本质为结构的名称)。
//**注意如果此处Array被写为*Array那么在之后的程序中Array所定义的变量
(如Array a;中的‘a')的类型为指针;**//

Array array_create(int init_size)
{
    Array a;
    a.size = init_size;
    a.array = (int*)malloc(sizeof(int)*a.size );
    return a;    
}
void array_free(Array *a)
{
    free(a->array);//回收函数“a.array”的空间。
    a->array = NULL;//将函数“a.array”的指针指向NULL。(保险+1)
    a->size = 0;//将函数“a.array”的大小变为0.(保险+1)
}    

int array_size(const Array *a)//封装,将实现a.array函数大小的方式进行保护固定,以防止应程序复杂化后使a.size的表达发生错误。
{
    return a->size;
}

int* array_at(Array  *a,int index);//经此函数生成指向函数“a.array”的第“index”位上的指针。
{
    if(index>=a->size){
    array_inflate(a,(index/BLOCK+1)*BLOCK-a->size);
    }
    return &(a->array[index]);
}
int array_get(cons Array *a, int index)//此函数可输出a.array的第index位的值。
{
    return a->array[index];
}
void array_set(Array *a, int index,int value)//此函数可通过array_set(&a, index,value);的代码将a.array的第index的值改为value.
{
    a->array[index] = value;
}
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->array"。
    a->size += more_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 index);

int main()
{
    Array a = array_create(100);//经过此函数后可生成一个名为“a.array”的数组,其大小为a.size(=输入的”init_size"=100);
                        //**数组的名称受Array所定义的变量名称影响。**//
    printf("%d\n",array_size(&a));//不是如printf("%d\n",a.size);直接输出a.size的值。
    *array_at(&a, 0) = 10;//对函数“a.array”的第0位进行赋值。
    printf("%d\n",*array_at(&a,0));//输出函数“a.array”的第0位的值。
    int cnt = 0;
    while(1){
        scanf("%d",*array_at(&a,cnt++));
    }
    array_free(&a);//当数组脱离主程序后,其所占有的空间会被自动回收,但是此处生成的数组“a.array”因为是由malloc获取
                                                空间的,所以要经过此函数进行回收。
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值