学习笔记:可变数组。

/*函数: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
#include
#include
#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; isize; 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获取
                                                空间的,所以要经过此函数进行回收。
    
}

你可能感兴趣的:(学习)