期末考完事,正好有时间系统的过了一遍C语言基础(小菜一枚)
在慕课上,刷了一遍浙大翁恺的课程(对于c基础差的,极力推荐,讲的非常棒),主要是想再深入学习下指针、链表的知识。
本次学习,最大的收获莫过于,掌握了如何灵活的使用数组。
我们都知道,在c中,其实数组本质上也是指针的一种形式,一旦定义以后,数组的长度就确定了,不能改变。
对于输入长度未知的一连串数据,想要把它用数组记录下来,还是有点麻烦的。当然,你可以直接给数组开一个很大很大的空间,
但是 1、再大的长度,也可能有越界的情况。 2、最好不要养成这样写代码的习惯。
好,废话少说,直接附上自己的源代码。(其实最主要的部分,就是那个inflate函数,对于数组的扩充关键。
//这个是array.h文件
#ifndef _ARRAY_H_
#define _ARRAY_H_
typedef struct {
int *array;
int size;
} Array;
Array array_creat(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 more_size);
#endif
#include "array.h"
#include<stdio.h>
#include<stdlib.h>
const BLOCK_SIZE = 5; //每次扩充数组的size
Array array_creat(int init_size)//创建一个数组
{
Array a;
a.array = (int*) malloc(sizeof(int)*init_size);
a.size =init_size;
return a;
}
void array_free(Array *a)//用完之后,要释放数组所占的内存空间
{
free(a->array);
a->array = NULL;
a->size = 0;
}
int array_size(const Array *a) //,获得数组size,封装,保护具体的函数细节
{
return a->size;
}
int* array_at(Array *a,int index)//访问数组内部的数据,读和写都可以
{
if( index >= a->size ){ //如果写入的size超过原数组size,进行数组扩充,每次扩充 一个BLOCK,可以修改
array_inflate(a,(index/BLOCK_SIZE+1)*BLOCK_SIZE-a->size);
}
return &(a->array[index]);
}
int array_get(const Array *a,int index)
{
return a->array[index];
}
void array_set(Array *a,int index,int 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->size += more_size;
}
int main()
{
Array a = array_creat(1);//创建一个size为1的数组
*array_at(&a,0) = 10;//向数组写入一个数据
printf("array_size=%d\n",array_size(&a));//输出数组的size
int number;
int cnt = 0;
while ( number != -1) { //可以无限输入数据,不断的扩充数组size
scanf("%d",&number);
if( number != -1)
*array_at(&a,cnt++) = number;
}
printf("array_size=%d\n",array_size(&a));//输出数组的size
for ( cnt=0; cnt<a.size; cnt++){//输出数组的全部数据,这里有个bug,未写入空间,可能是一些随机的数据
printf("a[%d]=%d\t",cnt,*array_at(&a,cnt));
}
array_free(&a);//释放数组空间
return 0;
}
第一次写c语言的博客,有问题,欢迎一起探讨!