今天学习了中国大学mooc上翁恺老师《C语言程序设计》的第14课链表。在学习链表之前,老师讲解了普通的可变数组的实现。
前奏:可变数组的实现(有缺陷)
首先定义一个结构体,内部存在一个指针和存放大小的变量
typedef struct{ int *array; int size; }Array;
其次明确目标,对数组所需的操作有:创建 丶清除(释放内存) 丶显示大小 丶访问和赋值 丶扩大这几个功能
函数申明如下:

#define BLOCK 20
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 more_size);

1.创建

Array array_create(int init_size)
{Array a;a.size = init_size;a.array = (int*)malloc(sizeof(int)*a.size);//开辟一块新的空间return a;
}

2.清除
这一部分比较简单

void array_free(Array *a)
{free(a->array);a->array = NULL;a->size = 0;
} 

3.显示大小

int array_size(const Array *a){return a->size;
}

4.访问和赋值

int *array_at(Array *a,int index)
{if(a->size<=index)array_inflate(a,(index/BLOCK+1)*BLOCK-a->size);return &(a->array[index]);
}//返回指针是为了 能对值加以修改 

思考一下,为什么采用返回指针呢?返回int不是更香嘛?
事实上,我们不仅要访问,还要对值进行修改,只有取得变量的地址才能进行操作。
例如:*array_at(&a,1000) = 101;
5.数组的扩大(核心)
这是区别去其他数组的地方
事实上malloc申请的内存是不可变的,于是我们智能通过申请一块新的内存对原先的进行覆盖。

void array_inflate(Array *a,int more_size)//放大原理,制造一片新的空间
{int* p = (int*)malloc(sizeof(int)*(more_size+a->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;
}

在这里定义了一个BLOCK 恒为20.

学习过程中,发现自己忘记了.和->的区别,多次编译出错.经过百度后知道:
结构体用点,结构体指针用箭头。(*p).member等价于p->member
注意:这样的可变数组是有缺陷的:1.当数目较大时,每次开辟内存所占空间较大 2.当内存有限制时,可能无法申请到内存

需要用链表。

c语言学习之可变数组相关推荐

  1. 如何判断数组所有数都不等于一个数_工程师编程,C语言学习,关于数组方面的一些总结...

    在学习编程语言时,无论如何我们都逃不掉关于数组这个问题. 那么,在谈及这个问题时,我会从三个方面来思考: 1.数组的定义是什么,也就是何为数组? 2.如何在数组中填充元素(数据)? 3.如何用数组来解 ...

  2. c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  3. C语言学习笔记---可变参数

      在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能. 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参 ...

  4. C语言学习之将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1. 要求改为1,4,5,6,8。

    将一个数组中的值按逆序重新存放.例如,原来顺序为8,6,5,4,1. 要求改为1,4,5,6,8. #include <stdio.h> #define N 5 void main(){i ...

  5. 21 11 7 C语言学习总结(数组越界,数组名作为函数参数,数组名)

    一 数组越界 数组的下标是有范围限制的 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的 ...

  6. 【C语言学习】 输出数组中最大的数

    一.题目要求,自定义一个数组,要求输出数组中最大的值. 二.解题思路: 1.先求出数组中的长度,也就是数组的个数. 2.编写一个循环,利用数组的长度下标作为限制,进行循环,将较大的值与较小的值进行替换 ...

  7. C语言学习 二维数组行列互换

    二维数组行列互换 Description 将一个二维数组的行和列元素互换,存放到另一个二维数组中. Input 第一行输入两个整数m和n分别表示二维数组的行数和列数(均小于20). 下一行输入该二维数 ...

  8. C语言学习11:strlen()函数详解

    目录 1.strlen()函数功能 2.strlen()函数的使用 2.1 数组 3.注意事项 1.strlen()函数功能 strlen()函数 用于 计算 指定字符串的 长度,但 不包括 结束字符 ...

  9. C语言如何加缓冲,C语言学习笔记之输出缓冲

    在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...

最新文章

  1. win7怎么修改oracle登陆密码,win7账户密码如何修改|win7修改账户密码的详细步骤...
  2. 自主研发:3通道1GS/s FPGA+DSP板
  3. matlab中读文件的行数_Matlab中读取txt文件的几种方法
  4. Android之CheckBox进行代码设置setChecked(true)会触发setOnCheckedChangeListener事件
  5. ipconfig命令指南
  6. 唯一《可解释机器学习》中文书来了:复旦研究生翻译,原作者转发点赞
  7. IOS打开pdf文件
  8. mac回车键、空格键失灵解决方法
  9. 控制系统伯德图、带宽及动态响应的关联性
  10. 人工智能 - 虚拟人 - 2D/3D 动作捕捉
  11. C# 压缩和修复Access数据库
  12. mac 远程连接 Windows 桌面
  13. PLUS模型教程1:认识PLUS模型
  14. PySide2学习总结(十二)打开文件对话框--FileDialog
  15. srs系列七——Vhost模式
  16. Gradle本地化构建技巧之自定义Gradle配置文件
  17. 利用JUZ包实现文件压缩和解压
  18. (英语)热门话题词汇整理 (更完)
  19. 京东618动物联盟自动化一键完成工具
  20. 医院信息系统基本功能规范---门急诊划价收费分系统功能规范

热门文章

  1. [转]为什么你应该开始学习编程?
  2. 全境2服务器维护3月16,《全境封锁2》4月16日更新内容一览
  3. 7.串口(UART)
  4. Redis有序集合命令ZRANGEBYLEX详解与应用
  5. 基于微信电器家电商城小程序系统设计与实现 开题报告
  6. 亚稳态/异步电路/glitch(毛刺)/glitchFree clk切换的一些疑问及理解
  7. 【vue2,3使用QRCode进行二维码的生成和下载】
  8. Android 5.0,6.0,7.0,8.0, 9.0新特性
  9. 网络层ICMP和ARP协议介绍
  10. HOT 100(61~80)【LeetCode】