c语言学习之可变数组
今天学习了中国大学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语言学习之可变数组相关推荐
- 如何判断数组所有数都不等于一个数_工程师编程,C语言学习,关于数组方面的一些总结...
在学习编程语言时,无论如何我们都逃不掉关于数组这个问题. 那么,在谈及这个问题时,我会从三个方面来思考: 1.数组的定义是什么,也就是何为数组? 2.如何在数组中填充元素(数据)? 3.如何用数组来解 ...
- c语言数组与指针的基础知识,C语言学习笔记之数组与指针的关系
首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...
- C语言学习笔记---可变参数
在C语言中有些函数传递进入的参数数量是不固定的,最常见的就是 printf() 函数,它就是利用可变参数来实现任意格式的数据打印功能. 我们自己也可以编写一个参数可变的函数,每次动态的检测传入的参 ...
- 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 ...
- 21 11 7 C语言学习总结(数组越界,数组名作为函数参数,数组名)
一 数组越界 数组的下标是有范围限制的 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的 ...
- 【C语言学习】 输出数组中最大的数
一.题目要求,自定义一个数组,要求输出数组中最大的值. 二.解题思路: 1.先求出数组中的长度,也就是数组的个数. 2.编写一个循环,利用数组的长度下标作为限制,进行循环,将较大的值与较小的值进行替换 ...
- C语言学习 二维数组行列互换
二维数组行列互换 Description 将一个二维数组的行和列元素互换,存放到另一个二维数组中. Input 第一行输入两个整数m和n分别表示二维数组的行数和列数(均小于20). 下一行输入该二维数 ...
- C语言学习11:strlen()函数详解
目录 1.strlen()函数功能 2.strlen()函数的使用 2.1 数组 3.注意事项 1.strlen()函数功能 strlen()函数 用于 计算 指定字符串的 长度,但 不包括 结束字符 ...
- C语言如何加缓冲,C语言学习笔记之输出缓冲
在c语言中经常用到输出函数printf,当我们像往常一样在输出函数中输入我们的想要的输出的东西后加\n换行 验证结果如我们输出的一样 如果我们在后面加入死循环会不会出现这些语句呢 结果卡死了,可还是输 ...
最新文章
- win7怎么修改oracle登陆密码,win7账户密码如何修改|win7修改账户密码的详细步骤...
- 自主研发:3通道1GS/s FPGA+DSP板
- matlab中读文件的行数_Matlab中读取txt文件的几种方法
- Android之CheckBox进行代码设置setChecked(true)会触发setOnCheckedChangeListener事件
- ipconfig命令指南
- 唯一《可解释机器学习》中文书来了:复旦研究生翻译,原作者转发点赞
- IOS打开pdf文件
- mac回车键、空格键失灵解决方法
- 控制系统伯德图、带宽及动态响应的关联性
- 人工智能 - 虚拟人 - 2D/3D 动作捕捉
- C# 压缩和修复Access数据库
- mac 远程连接 Windows 桌面
- PLUS模型教程1:认识PLUS模型
- PySide2学习总结(十二)打开文件对话框--FileDialog
- srs系列七——Vhost模式
- Gradle本地化构建技巧之自定义Gradle配置文件
- 利用JUZ包实现文件压缩和解压
- (英语)热门话题词汇整理 (更完)
- 京东618动物联盟自动化一键完成工具
- 医院信息系统基本功能规范---门急诊划价收费分系统功能规范
热门文章
- [转]为什么你应该开始学习编程?
- 全境2服务器维护3月16,《全境封锁2》4月16日更新内容一览
- 7.串口(UART)
- Redis有序集合命令ZRANGEBYLEX详解与应用
- 基于微信电器家电商城小程序系统设计与实现 开题报告
- 亚稳态/异步电路/glitch(毛刺)/glitchFree clk切换的一些疑问及理解
- 【vue2,3使用QRCode进行二维码的生成和下载】
- Android 5.0,6.0,7.0,8.0, 9.0新特性
- 网络层ICMP和ARP协议介绍
- HOT 100(61~80)【LeetCode】