CPP知识点笔记(二)
23. 预处理命令
23.3 预处理命令——文件包含
#include <文件名> //头文件可以写成 绝对路径形式
#include "文件名" //一般写成 相对路径形式,系统默认路径去找
相对路径有两个:1.编译器系统INCLUDE路径:”C:\DEV\MinGW\include”,尖括号;
2.用户路径,一般是工程project路径,
【注】:尖括号只在系统路径下找;双引号,现在用户路径下找,再去系统路径下去找。
重复包含问题!(降低预处理速度、死循环)
1.条件编译
#ifdef 条件字段
代码段
#endif
或者
#ifdef 条件字段
代码段1
#else
代码段2
#endif
- #if条件编译命令
#if 常量表达式
#else
#endif
还能解决,不同的开发平台,不同的硬件条件,不同的代码段被编译。提高程序的通用性。
23.1 预处理命令
1. 预处理命令 的一种——宏定义
用一个 标识符 代表 一个字符文本,称为宏;标识符为宏名
#define PI 3.1415926 //#define 宏名 字符文本。1.不带参数的宏定义
#define max(a,b) ((a)>(b))?(a):(b) //#define 宏名(参数表) 字符文本
【注】:为了保证带参数的 宏展开和本意相符,应该在 宏串或者 实参字符串中加入必要的括号。(约定好,不要两处都加,或两处都不加)
2.预处理命令——#和##
【注】:老师此处讲前两条的输出相同,实际测试其实是不同的。
即被替换的对象不同??这句话有什么含义?
22. 自定义数据类型的应用——链表
22.3 链表的运算
1.链表的遍历 让p指向下一个节点:LinkList p=L->next; p = p->next;
比方说,visit函数用来输入数据,到指定的数据域:
2. 查找结点
此处,compare函数的功能是 比较是不是相等.
3.插入结点,位置可能在头节点、尾节点、中间结点
4. 删除结点 找插入或删除的前面的一个结点
【注意】:图中*L的箭头指向 数据区 更合理。
q,p表示的是 结点;q->data表示的是结点的数据;q->next表示的是下一个结点的地址。进一步,q给出的地址 将 和&(q->data)相同。
链表:一种存储空间能动态进行增长或缩小的数据结构;
1.不定长度;2.不改变整体存储结构的前提下,方便地插入和删除;(特点都是和数组对比的)
其中,ElemType为可以为内置类型,如,typedef int ElemType;可以为自定义数据类型,如结构体;
单链表:头结点;尾节点;(循环链表:尾节点指向头结点)
双链表 较 单链表更加安全!(双向循环链表:尾节点next指向头结点;头结点prev指向尾节点)
不要求存储空间连续;
22.2 创建单链表
应用了前面介绍的动态内存分配技术:
Linklist p; //链表指针 结合typedef LNode* LinkList;
//可以知道,该语句等价于 LNode* p; 定义了一个指向单链表节点类型的指针
p = new LNode; //创建LNode类型的内存单元,其地址保存在p中。
两种方法:头插法和尾插法
头插法 即先生成链表头节点,然后不断延长,新建的节点总是紧接着插入在头结点之后。
最后两步,最关键!!20行
尾插法,这个更符合习惯,不断延伸的感觉。
(3)销毁链表
*L=NULL;//是一个收尾的操作,否则,L指向一个曾经存在对象,会变成迷途指针。
21. 自定义数据类型
21.3 共用体union类型
共用体的内存长度,是成员里面类型的最大值;例子中,开辟的空间的长度为4个字节,长度由int型确定;且要么放m,要么n,要么a,要么b 它们公用这个空间!
共用体主要用在什么场合呢?数据通信里?不知道什么格式,但能保证所有格式都放得下。
21.4 枚举类型
命名枚举常量;代表得就是几个整型数而已。这几个数可以默认,可以指定。
唯一,且因为是常量不能作为左值;
21.5 typedef 自定义类型名往往很长
21.3 结构体与函数
结构体对象作为函数的实参,是值传递;
将结构体数组作为实参,进行了地址传递;
将结构体指针作为函数实参,进行的是地址传递。
函数的返回类型可以是结构体类型,跟一个普通类型的对象是一样的。
21.1 结构体的定义与使用
数组,类型相同的数据组合在一起;结构体,类型(可以)不同的数据组合在一起
1.定义结构体类型-学生-用于保存学生信息,组合成一个类型(整体)
结构体类型一般放在程序文件的开头,这样处处可见,可用。
2.结构体类型实例化:此时才会分配内存空间。叫做定义该结构体类型的对象。
3.内存形式:对象的内存字节数,为所有成员字节数之和,且按成员顺序来。
4.用花括号列表赋值初始化;注意顺序。
5.成员引用;【注】:不能将结构体对象作为整体进行输入、输出;可以结构体对象间赋值运算,不能加减、比较。
21.2 结构体与数组、指针、函数
1.结构体数组:即,数组的元素是结构体类型;注意顺序!
数组下标运算+结构体对象成员引用 实现 引用。
2.结构体类型中可以包含数组成员。没有单独的名称。
例子中,的数组成员,是特殊的结构体数组;
3.结构体对象的地址
&对象名.成员名
4.通过指向结构体的指针,引用结构体成员。
1). 对象法 (*p).成员名
2). 指针法 p->成员名
20. 动态分配内存
20.2 动态分布数组
动态分配一维或多维数组的方法是由指针管理数组
计算N*N二维数组的元素平均值
20.3 动态分配字符串
char *p=new char[n];
20.1 new与delete运算
固定长度的内存——数组;(定义多大,既不会不够用,又不会浪费?)
1. 静态分配方式
2.动态分配方式
【注】:销毁对象后,指针变成了迷途指针,应及时设为NULL;
且 分配与释放 一一对应,不能多不能少。
动态分配内存的生命期,是我们决定的,可以跨多个函数。
- 分配、输出、释放的函数
上一篇: Django教程--Form表单
下一篇: Django之Form表单
推荐阅读
-
HTML5 video标签(播放器)学习笔记(二):播放控制
-
【MySQL解惑笔记】Mysql5.7.x无法开启二进制日志
-
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
-
前端笔记知识点整合之JavaScript(七)深入函数&DOM那点事
-
前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API
-
C#Web应用程序入门经典学习笔记之二
-
JDBC学习笔记二
-
.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用
-
Linux学习笔记(十四)磁盘管理(二):格式化、挂载以及Swap分区
-
词法分析---基于Asp.NET(实验二学习笔记)