可变数组
可以实现一个函数库,定义一些函数。creat创建数组;free回收数组空间;size查询单元个数;at访问数组某个单元;inflate使数组扩大。
可以看到函数需要传入的变量都是指针,因为指针更加轻巧!!!
前排提醒:传址方式需要传入指针或者变量的地址!!
create函数:
没有传入指针,传入的是你所需要的数组的大小。因为在函数内部通过return返回结构变量a,进而赋值。因为不需要在函数内部做出改变,所以传值方式即可。
free函数:
传入函数的参数是指针(结构变量a的地址),属于传址方式。在主函数内部Array a = array_creat(100);
程序结束之后本地结构变量a会自动回收,但其中内部的结构成员变量(指针变量)*array
不会释放,所以要通过free函数释放指针所指的内存:free(a->array); 做保险:a->array = 0;a->size = 0;
以上代码全部应该是在函数内部,此a非彼a,这里的a指的是函数括号中的形参avoid array_free(*a){}
。
size函数:
//封装
int array_size(const Array *a )//传入指针或者地址
{
return a->size;
}
printf("%d",array_size(&a));
//因为a->size == (*a).size 其实就是访问结构变量的成员,不过是通过指针取地址的方式(复习)
//至于为什么那么不是传入整个结构变量a而是传入*a:传入指针轻巧!!
那为什么不直接访问呢:
printf("%d",a.size);
简单来说函数将a的size保护起来了…
at函数:
int* array_at(Array *a,int index)
{
return &(a->array[index]);
}
printf("%d",*array_at(&a));
因为函数返回的是指针,所以进行的操作是*指针
,与之对应的操作是&普通变量
。&普通变量
== 指针
;*(&普通变量)== 普通变量值
。
为什么函数返回的是*int
而不是int
呢?
因为可以实现函数调用对数组进行赋值操作:*(array_at(*a,0)) = 7;
这里相当于a[0] =7;
实现读的功能:printf("%d",*array_at(&a));
实现写的功能:*(array_at(*a,0)) = 7;
因为malloc申请的空间不可改变,所以要重新申请一块空间,其大小是原来的空间大小+所需的额外的空间的大小。然后把原来空间的东西放到新的空间。