CPP知识点笔记(二)

23. 预处理命令

23.3 预处理命令——文件包含

#include <文件名>  //头文件可以写成 绝对路径形式
#include "文件名"  //一般写成 相对路径形式,系统默认路径去找

相对路径有两个:1.编译器系统INCLUDE路径:“C:\DEV\MinGW\include”,尖括号;
2.用户路径,一般是工程project路径,
【注】:尖括号只在系统路径下找;双引号,现在用户路径下找,再去系统路径下去找。
重复包含问题!(降低预处理速度、死循环)
1.条件编译

#ifdef 条件字段  
	代码段
#endif
或者
#ifdef 条件字段
	代码段1
#else
	代码段2
#endif
  1. #if条件编译命令
#if 常量表达式

#else

#endif

还能解决,不同的开发平台,不同的硬件条件,不同的代码段被编译。提高程序的通用性。

23.1 预处理命令

CPP知识点笔记(二)_第1张图片
CPP知识点笔记(二)_第2张图片

  1. 预处理命令 的一种——宏定义
    用一个 标识符 代表 一个字符文本,称为宏;标识符为宏名
    CPP知识点笔记(二)_第3张图片
#define PI 3.1415926  //#define 宏名 字符文本。1.不带参数的宏定义
#define max(a,b) ((a)>(b))?(a):(b) //#define 宏名(参数表) 字符文本

【注】:为了保证带参数的 宏展开和本意相符,应该在 宏串或者 实参字符串中加入必要的括号。(约定好,不要两处都加,或两处都不加)
2.预处理命令——#和##
CPP知识点笔记(二)_第4张图片
【注】:老师此处讲前两条的输出相同,实际测试其实是不同的。
CPP知识点笔记(二)_第5张图片
即被替换的对象不同??这句话有什么含义?

22. 自定义数据类型的应用——链表

22.3 链表的运算

1.链表的遍历 让p指向下一个节点:LinkList p=L->next; p = p->next;
CPP知识点笔记(二)_第6张图片
比方说,visit函数用来输入数据,到指定的数据域:
CPP知识点笔记(二)_第7张图片
2. 查找结点
CPP知识点笔记(二)_第8张图片
此处,compare函数的功能是 比较是不是相等.
3.插入结点,位置可能在头节点、尾节点、中间结点
CPP知识点笔记(二)_第9张图片
CPP知识点笔记(二)_第10张图片
4. 删除结点 找插入或删除的前面的一个结点
CPP知识点笔记(二)_第11张图片
CPP知识点笔记(二)_第12张图片
【注意】:图中*L的箭头指向 数据区 更合理。
q,p表示的是 结点;q->data表示的是结点的数据;q->next表示的是下一个结点的地址。进一步,q给出的地址 将 和&(q->data)相同。

链表:一种存储空间能动态进行增长或缩小的数据结构;
1.不定长度;2.不改变整体存储结构的前提下,方便地插入和删除;(特点都是和数组对比的)
CPP知识点笔记(二)_第13张图片
其中,ElemType为可以为内置类型,如,typedef int ElemType;可以为自定义数据类型,如结构体;
单链表:头结点;尾节点;(循环链表:尾节点指向头结点)
CPP知识点笔记(二)_第14张图片
双链表 较 单链表更加安全!(双向循环链表:尾节点next指向头结点;头结点prev指向尾节点)
CPP知识点笔记(二)_第15张图片
CPP知识点笔记(二)_第16张图片
不要求存储空间连续;

22.2 创建单链表

应用了前面介绍的动态内存分配技术:

Linklist p; //链表指针 结合typedef LNode* LinkList;
//可以知道,该语句等价于 LNode* p; 定义了一个指向单链表节点类型的指针
p = new LNode; //创建LNode类型的内存单元,其地址保存在p中。

两种方法:头插法和尾插法
头插法 即先生成链表头节点,然后不断延长,新建的节点总是紧接着插入在头结点之后。
CPP知识点笔记(二)_第17张图片
CPP知识点笔记(二)_第18张图片
CPP知识点笔记(二)_第19张图片
最后两步,最关键!!20行
**尾插法,这个更符合习惯,**不断延伸的感觉。
CPP知识点笔记(二)_第20张图片
(3)销毁链表
CPP知识点笔记(二)_第21张图片
CPP知识点笔记(二)_第22张图片
*L=NULL;//是一个收尾的操作,否则,L指向一个曾经存在对象,会变成迷途指针。

21. 自定义数据类型

21.3 共用体union类型

CPP知识点笔记(二)_第23张图片
CPP知识点笔记(二)_第24张图片
共用体的内存长度,是成员里面类型的最大值;例子中,开辟的空间的长度为4个字节,长度由int型确定;且要么放m,要么n,要么a,要么b 它们公用这个空间!
共用体主要用在什么场合呢?数据通信里?不知道什么格式,但能保证所有格式都放得下。

21.4 枚举类型

命名枚举常量;代表得就是几个整型数而已。这几个数可以默认,可以指定。
唯一,且因为是常量不能作为左值;
这里写图片描述

21.5 typedef 自定义类型名往往很长

CPP知识点笔记(二)_第25张图片

##21.3 结构体与函数
结构体对象作为函数的实参,是值传递;
将结构体数组作为实参,进行了地址传递;
将结构体指针作为函数实参,进行的是地址传递。
函数的返回类型可以是结构体类型,跟一个普通类型的对象是一样的。

21.1 结构体的定义与使用

数组,类型相同的数据组合在一起;结构体,类型(可以)不同的数据组合在一起
1.定义结构体类型-学生-用于保存学生信息,组合成一个类型(整体)
CPP知识点笔记(二)_第26张图片
结构体类型一般放在程序文件的开头,这样处处可见,可用。
2.结构体类型实例化:此时才会分配内存空间。叫做定义该结构体类型的对象。
3.内存形式:对象的内存字节数,为所有成员字节数之和,且按成员顺序来。
这里写图片描述
4.用花括号列表赋值初始化;注意顺序。
5.成员引用;【注】:不能将结构体对象作为整体进行输入、输出;可以结构体对象间赋值运算,不能加减、比较。

21.2 结构体与数组、指针、函数

1.结构体数组:即,数组的元素是结构体类型;注意顺序!
CPP知识点笔记(二)_第27张图片
数组下标运算+结构体对象成员引用 实现 引用。
2.结构体类型中可以包含数组成员。没有单独的名称。
CPP知识点笔记(二)_第28张图片
例子中,的数组成员,是特殊的结构体数组;
3.结构体对象的地址
&对象名.成员名
CPP知识点笔记(二)_第29张图片
4.通过指向结构体的指针,引用结构体成员。
1). 对象法 (*p).成员名
2). 指针法 p->成员名
CPP知识点笔记(二)_第30张图片

20. 动态分配内存

20.2 动态分布数组

动态分配一维或多维数组的方法是由指针管理数组
计算N*N二维数组的元素平均值
CPP知识点笔记(二)_第31张图片

20.3 动态分配字符串

char *p=new char[n];

20.1 new与delete运算

固定长度的内存——数组;(定义多大,既不会不够用,又不会浪费?)

  1. 静态分配方式
    CPP知识点笔记(二)_第32张图片
    2.动态分配方式
    CPP知识点笔记(二)_第33张图片
    CPP知识点笔记(二)_第34张图片
    【注】:销毁对象后,指针变成了迷途指针,应及时设为NULL;
    且 分配与释放 一一对应,不能多不能少。
    动态分配内存的生命期,是我们决定的,可以跨多个函数
  • 分配、输出、释放的函数
    CPP知识点笔记(二)_第35张图片

你可能感兴趣的:(CPP知识点笔记(二))