一、数据抽象
1.目的:因为计算机内部的存储存在信息缺失,数据原本存在VANT(值、地址、名字、类型),在存储的时计算机内部值村才地址和值。程序员注重功能,计算机注重存储,但是功能比存储更重要,需要对数据进行抽象,让人和计算机都能读懂程序。
2.结构化数据类型
个人理解:根据已有的数据类型复合成一个新的数据结构,并且包含对该结构的一个操作集合。
3.数据封装
将数据结构信息隐藏,不希望对一个对象的修改引起对大部分或者所有使用到他的对象都进行修改。也就是希望使用者使用相应的函数接口而不是直接访问数据对象。
4.信息隐藏
头文件用户是可见的,源文件可以不发放。**因此将结构体具体的细节定义在源文件中,只发放函数的定义接口,从而实现信息隐藏。**编写抽象程序必然结合数据封装和信息隐藏 。(良好的编程习惯)
二、链表
链表的组成、性质是我之前就掌握的,不作多的解释,这部分记录之前的没有掌握的。
指针指来指去让人头大,这部分去网上做相关练习。
链表只能表示二维的数据结构,没法实现抽象、通用数据结构的表示,要想实现,引入函数指针。
1.函数指针
用于抽象数据和抽象代码的表示,能使数据和算法统一起来。函数指针指向函数的入口地址就可以使这段函数执行完毕(主函数中)。
定义: 数据类型 (* 函数指针数据对象名称) (形式参数列表);
char typedef void * ADT;
//ADT为通用数据类型
char (*as_string)(ADT object);
//名为as_string的指针,指向带有ADT类型参数、返回值为char *的函数,as——string为函数指针变量,全小写
- 函数指针变量可以像普通变量一样赋值
- 函数指针被赋值之后,即指向实际函数的入口地址
- 用函数指针变量作为函数的形式参数是很常用也是很必要掌握的
- 对函数指针赋值的函数参数和类型的格式需要和函数指针一致,类型不同不能赋值。
2.函数指针类型
使用函数指针类型来区分不同类型的函数指针
格式:typedef 数据类型 (* 函数指针数据对象名称) (形式参数列表)
此时函数指针数据对象名称为函数指针类型,表示类型的时候需要全部大写。
typedef int (* COMPARE_OBJECT)(const void *x,const void *y);
//可以像普通类型一项使用函数指针类型定义变量
COMPARE_OBJECT campare=DoCompare;//也可以写到函数参数中
//DoCompare是已经存在的函数,函数参数和类型的格式需要和函数指针一致
swap(COMPARE_OBJECT campare);
回调函数
链表的存储和删除
链表节点的存储可能存储的是数据也可能是指针,指针可能指向数据也可能指向函数。
删除节点的时候需要注意,如果节点里面存储的是指针还需要删除指针指向的对象(大部分情况下需要删除)。如果是数据直接删除就好。
引申问题:那么如何实现删除呢?
检测对应的对象是否为指针,是则删除,不是则不删除
二、散装问题、知识点
1.为什么要用无符号整型呢?
2.C++的内存模型是什么?
3.void * 类型是什么?
哑型指针,用来表示抽象的目标对象,意味着目标数据类型未知
typedef void * ADT;
typedef const void * CADT;
int Compare(const void *x,const void *y){
return CompareInt(*(const int *)x,*(const int *)y);
}//需要将void *转换成特定的数据类型,需要先转换后引领
4.引领操作符是什么?
5.函数指针的用法?需要大量的代码练习
6.比较函数返回值必须是正负1,0之一,不同的参数代表不同的意思
11.3日补充
1.附加参数的作用是什么呢?
2.对附加参数、回调函数不是很理解
3.如何设计一个不依赖所存储的具体数据类型的抽象链表?
4.如何实现动态数组库?
三、推荐书籍
《深入理解计算机系统》
《你的降落伞是什么颜色》
四、一些段子
1.当我讨厌一个人的时候,如果那个人突然说喜欢我,那我就一点也不讨厌对方了。就是这么有原则,无法讨厌一个有眼光的人。
2.要不是复读一年我险些就成为一名医生了,但是我觉得学医没法拯救国人,所以我拿起了键盘。
3.买键盘得买上等木材的,这样磨出包浆还能卖不少钱
4.一部手机的寿命在3-5年,人的寿命在70-100年,手机只是人类眼中的过客,但对于手机来说,你就是他的一生,所以,放下身边的杂活,多陪陪你的手机。
五、感悟
读书没必要把所有的东西都读懂,读当前阶段能理解的,当前阶段有感悟的东西。有些道理现在没有太多的感受,就不用过度纠结或者生硬的使用,记下来,脑子里有个映象就好。
学习语言也是,不要在一个地方纠结太久。现有一个整体的框架