可变数组^

本文探讨了如何在C语言中合理使用结构体、指针和封装技术来管理动态数组。作者介绍了数组创建、大小获取、元素访问与增长优化的方法,并强调了灵活性和封装原则。通过实例演示了`array_at`函数的两种不同实现,以及为何选择特定方法。
摘要由CSDN通过智能技术生成

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值