欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CPP知识点笔记(二)

程序员文章站 2022-04-25 15:21:50
...

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知识点笔记(二)
CPP知识点笔记(二)
1. 预处理命令 的一种——宏定义
用一个 标识符 代表 一个字符文本,称为宏;标识符为宏名
CPP知识点笔记(二)

#define PI 3.1415926  //#define 宏名 字符文本。1.不带参数的宏定义
#define max(a,b) ((a)>(b))?(a):(b) //#define 宏名(参数表) 字符文本

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

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

22.3 链表的运算

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

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

22.2 创建单链表

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

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

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

21. 自定义数据类型

21.3 共用体union类型

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

21.4 枚举类型

命名枚举常量;代表得就是几个整型数而已。这几个数可以默认,可以指定。
唯一,且因为是常量不能作为左值;
CPP知识点笔记(二)

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

CPP知识点笔记(二)

21.3 结构体与函数

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

21.1 结构体的定义与使用

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

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

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

20. 动态分配内存

20.2 动态分布数组

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

20.3 动态分配字符串

char *p=new char[n];

20.1 new与delete运算

固定长度的内存——数组;(定义多大,既不会不够用,又不会浪费?)
1. 静态分配方式
CPP知识点笔记(二)
2.动态分配方式
CPP知识点笔记(二)
CPP知识点笔记(二)
【注】:销毁对象后,指针变成了迷途指针,应及时设为NULL;
且 分配与释放 一一对应,不能多不能少。
动态分配内存的生命期,是我们决定的,可以跨多个函数

  • 分配、输出、释放的函数
    CPP知识点笔记(二)
相关标签: CPP