1--首先这里定义这个结构为啥没有去直接typedef struct{
}*Array;如果定义结构指针后面很多函数所需要的结构都是传指针进去,方便了不少。
但是如果你想在一个函数中只是传值不传指针,就无法做到。
而且你后续在操作时Array a;一般不容易想到你定义了一个指针,不符合我们的常规操作。
我们习惯于在main函数中定义一个结构普通变量,函数需要值我们就传值,函数需要对结构变量进行修改我们就传指针。2--在针对这个问题恺哥所提供的思路是针对当前情况最好的解决办法,而非日后所有问题的最好解决办法,所以要灵活。师傅领进门,修为在个人。
3--为什么我们这里要专门去设立一个函数去返回数组大小,直接在main函数中printf("%d",a.szie);不就行了吗?这里恺哥给的名词叫做"封装",就是讲我以后做程序我肯定会去隐藏整个项目的实现过程,到时候就不是简单让你a.size就可以看到数组的长度了,而是用我给你的返回长度的那个函数才可以,(这只是现在浅显的理解,估计等以后具体做项目才能感受到)。
4--在array_at函数中,其返回值是int*,我们通常这样使用函数是传入数组和下标然后返回对应的值,所以直接返回int就行,但是这样的话只能查值,不能修改,但是我们传入指针的话,可以在如图所示在返回值前面加*号输出值,还可以加*号直接修改其值。
当然还有一种方法就是如下图所示将查值(array_get)与修改(array_set)分开。当然是选择第一种啦。 第一种注意返回值与函数类型的关系,感觉不是很好理解。建议与全局变量3一起食用。这里敢返回地址完全是因为这里系统分配了内存,所以地址在free前都是不变的。
5--还有就是在array_at()中调用array_inflate()实现数组增长时两种方法的对比,第二种发现数组长度不够时每次只会+1,但第一种方法可以实现每次加的长度由自己定义。效率更高。
int* array_at(Array *a,int index)
{
if (index>=a->size)
{
array_inflate(a,(index/block+1)*block-a->size);
}
return &(a->array[index]);
}
int* array_at(Array *a,int index)
{
if (index>=a->size)
{
array_inflate(a,index-a->size+1);
}
return &(a->array[index]);
}
下面是完整代码:
--main.h--
#ifndef _MAIN_H_
#define _MAIN_H_
typedef struct {
int *array;
int size;
}Array;
Array array_create(int 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);
#endif
--array.c--
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#define block 20
//typedef struct {
// int *array;
// int size;
//}Array;
//Array array_create(int 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 size)
{
Array a;
a.size=size;
a.array=(int*)malloc(sizeof(int)*a.size);
return a;
}
void array_free(Array *a)
{
free(a->array);
a->size=0;
a->array=NULL;
}
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+1)*block-a->size);
}
return &(a->array[index]);
}
//int* array_at(Array *a,int index)
//{
// if (index>=a->size)
// {
// array_inflate(a,index-a->size+1);
// }
// 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;
}
int main(int argc,char const *argv[]) {
Array a=array_create(5);
// printf("%d\n",array_size(&a));
// *array_at(&a,0)=100;
// printf("%d\n",*array_at(&a,0));
int num=0;
int cnt=0;
while (1)
{
scanf("%d",&num);
if (num!=-1)
{
*array_at(&a,cnt++)=num;
}else
{
break;
}
}
int i;
for (i=0;i<array_size(&a);i++)
{
printf("array[%d]=%d\n",i,a.array[i]);
}
array_free(&a);
return 0;
}