C++的学习第一部分
环境:Visual Studio 2017
一、第一个C++代码

system("pause")是一个用于暂停程序的代码,主要在 Windows 环境下使用,等待用户按下任意键后继续执行(或退出)。
二、注释、变量和常量
单行注释://
多行注释:/* */
变量:程序中值可以改变、用于暂存数据的命名内存空间。
常量:值在程序执行期间固定不变、用于定义不可修改数据的标识符。

三、关键字和标识符命名规则
关键字:编程语言中具有特殊含义、不能被用作变量或函数名的保留词(标识符)。

标识符命名规则
1、标识符不能是关键字。
2、标识符只能有数字、字母和下划线组成。
3、第一个字符必须是字母或下划线。
4、标识符中字母区分大小写。
四、数据类型
数据类型:用于定义变量或函数可存储的数据种类(如整数、浮点数、字符等)及内存占用大小的分类系统。
1、整型
整型:用于表示整数(不包含小数部分)的数据类型。
| 数据类型 | 占用内存 | 取值范围 |
| short(短整型) | 2字节 | (-2^15 ~ 2^15-1) |
| int(整型) | 4字节 | (-2^31 ~ 2^31-1) |
| long(长整型) |
Windows是4字节, Linux的32位下是4字节, Linux的64位下是8字节。 | (-2^31 ~ 2^31-1) |
|
long long (长长整型) | 8字节 | (-2^63 ~ 2^63-1) |
2、sizeof关键字
sizeof关键字:一个运算符,用于在编译时计算并返回某个数据类型或变量所占用的内存字节数。
语法:sizeof(数据类型) 或者 sizeof(变量)
3、实型(浮点型)
实型:用于表示带有小数部分的数值、以科学计数法存储的数据类型。
| 数据类型 | 占用内存 | 取值范围 |
| float(单精度) | 4字节 | 7位有效数字 |
| double(双精度) | 8字节 | 15 ~ 16位有效数字 |
单精度变量的创建:float f = 3.14f; 或者 float f = 3.14;
编译器会默认一个小数是double双精度的,一般情况下编译器输出的有效数字只有6位。
科学计数法:3e2➡️3*10^2,3e-2➡️3*10^-2
4、字符型
字符型:用于存储单个ASCII字符(本质是1字节整数)或转义序列的数据类型。
字符型变量占用1个字节,字符型变量的存储是将对应的ASCII编码放入存储单元中。

ASCII编码表格


5、转义字符
转义字符:以反斜线\开头、用于在字符常量中表示无法直接输入或具有特殊控制功能的字符序列。


\t水平制表符:一共占8个空间,作用是可以对齐输出数据。
6、字符串型
字符串型:由多个字符组成的序列,在C语言风格中以\0结尾的字符数组表示,在C++标准库中则通过std::string类来更安全、便捷地操作。
C语言风格的字符串:char 变量名[ ] = "字符串值";
C++风格的字符串:string 变量名 = "字符串值";

7、布尔类型
布尔类型:用于表示逻辑真(true)或逻辑假(false)的数据类型,其本质上也是整型,true对应1,false对应0。
bool类型占用的字节大小是1个字节。
逻辑真:非零数
逻辑假:零

8、数据的输入
数据的输入:通过标准输入流对象 std::cin 配合提取运算符 >>,从键盘等标准输入设备读取数据并存储到变量中的过程。

五、运算符
运算符:用于对数据进行运算操作的符号(如+、-、*、/等),通过指定运算类型来生成新的数值或结果。

1、算术运算符
算术运算符:用于执行基本数学运算(如加、减、乘、除、取模)的符号,包括 +、-、*、/ 和 %。

(1)加减乘除运算

(2)取模运算
取模运算就是求余数,两个小数不能进行取模运算。

(3)递增递减运算

2、赋值运算符
赋值运算符:用于将一个对象的值复制或移动到另一个已存在的对象中,并返回左侧对象的引用以实现链式赋值。

3、比较运算符
比较运算符:用于比较两个表达式的值,并返回一个布尔值(true 或 false)来表示比较结果是否成立。

4、逻辑运算符
逻辑运算符:用于对布尔值或可隐式转换为布尔值的表达式执行“与”、“或”、“非”运算,并返回布尔结果。

①非运算:假为真,真为假。②与运算:同真为真,其余为假。③或运算:同假为假,其余为真。
六、程序流程结构
C/C++的三种基本运行结构:顺序结构、选择结构、循环结构。
-
顺序结构:程序按代码书写顺序从上到下依次执行每条语句。
-
选择结构:根据条件表达式的真假(非零或零)选择执行不同的代码分支(如
if、switch)。 -
循环结构:在条件满足时重复执行一段代码块,直到条件不再成立(如
for、while、do-while)。
1、选择结构
(1)if语句
if语句:根据条件表达式的真假决定是否执行后续的单条语句或代码块。
if语句的三种形式
-
单行格式的if语句:条件为真时执行紧随其后的单条语句(无花括号时通常不推荐,易因缩进误导产生错误)。
-
多行格式的if语句:条件为真时执行由花括号
{}包裹的复合语句块,可包含多条语句。 -
多条件的if语句:通过
if-else if-else链依次检查多个条件,仅执行第一个满足条件的分支。
①单行if语句

②多行if语句

③多条件if语句

(2)嵌套if语句
嵌套if语句:在一个if或else语句的内部再包含另一个完整的if或if-else语句,用于实现多层次的条件判断。

(3)案例:三只小猪谁最重

(4)三目运算符
三目运算符:一种基于条件表达式直接返回两个值之一的简洁替代 if-else 的运算符。
语法:表达式1 ?表达式2 :表达式3

(5)switch语句
switch语句:一种基于整型表达式的多分支选择结构,用于将控制权转移到与条件值匹配的case标签处执行。
①switch语句中表达式类型只能是整型或者字符型。
②case语句中没有break会一直执行下去。


2、循环结构
(1)while循环
while循环:一种先判断条件,条件为真时才重复执行循环体,否则退出的入口条件循环。

(2)案例: 猜数字
(unsigned int)time(NULL)将time(NULL)的返回值强制转换成unsigned int类型。
srand()函数可以防止每次运行代码时都是一样的随机数。

(3)do...while循环
do...while循环:一种先执行一次循环体,再判断条件,条件为真时继续重复执行的出口条件循环。

(4)案例:水仙花数
水仙花数:一个 n 位数(n≥3),其各位数字的 n 次幂之和等于它本身(例如 153 = 1³+5³+3³)。

(5)for循环
for循环:一种通过初始化、条件判断和循环后操作三个表达式来控制循环次数的入口条件循环。

从第四步之后一直循环2-3-4,直到条件不满足,结束循环。
(6)案例:敲桌子
敲桌子:从1开始数到100,遇到7的倍数或数字中包含7的数时,不输出数字而是输出“敲桌子”(或“过”)。

(7)嵌套循环
嵌套循环:一个循环语句(如for、while、do...while)的循环体内完整包含另一个循环语句,用于处理多维数组、矩阵运算等需要多层迭代的逻辑。

(8)案例:乘法口诀表

(9)break语句、continue语句和goto语句
break语句:立即终止当前所在的最内层循环或switch结构,并跳出到其后继续执行。
continue语句:跳过当前循环体内后续未执行的代码,立即开始下一次循环迭代(仅用于循环结构)。
goto语句:无条件跳转到当前函数内由标签指定的位置,通常用于多层嵌套中一次性跳出或统一错误处理,但易破坏程序结构。

七、数组
数组:一种连续存储、索引从0开始的相同类型元素的集合,用于高效管理批量数据。
数组的特点:
①数组中每个元素的数据类型相同
②数组在内存中是连续的地址
③数组的元素个数是固定的
1、一维数组
一维数组:连续存储的同类元素线性序列,通过单一索引访问每个元素。
(1)定义方式

(2)数组名
①可以统计整个数组在内存中的长度
②可以获取数组在内存中的首地址
③数组名是常量,不可以赋值

(3)案例:五只小猪称体重

(4)案例:元素逆置

(5)冒泡排序
①基本思想
通过重复遍历待排序的序列,依次比较相邻元素,若顺序错误则交换,直到整个序列有序。
②排序过程(升序为例)
-
从头开始,比较每对相邻元素,若前者 > 后者则交换。
-
每轮遍历会将当前未排序部分的最大元素“浮”到末尾。
-
重复执行,直到某一轮没有发生任何交换。
③时间复杂度
-
最坏情况(完全逆序):O(n²)
-
平均情况:O(n²)
-
最好情况(已有序):O(n)(需添加优化标志)
④空间复杂度
O(1),仅需少量临时变量,属于原地排序算法。



2、二维数组
二维数组:可视为“数组的数组”,按行主序存储的矩阵结构,通过行索引和列索引访问元素。
(1)定义方式

(2)数组名
①可以查看二维数组所占用的内存大小
②可以查看二维数组的首地址

(3)案例:考试成绩统计

八、函数
函数:封装了特定功能的代码块,通过函数名可重复调用执行。
1、函数的定义
函数定义的五步骤:①返回值类型 ②函数名 ③参数列表 ④函数体语句 ⑤return表达式

2、函数的调用
函数调用:使用写好的函数 语法:函数名(参数)

3、值传递
值传递:函数调用时实参传递给形参。
⚠️注意:如果形参发生改变不会影响实参。
4、函数的常见样式
①无参无返 ②有参无返 ③无参有返 ④有参有返

5、函数的声明
函数的声明:告诉编译器函数存在及其返回值类型、参数类型和名称的“预告”,本身不包含函数实现体。
⚠️注意:函数声明可以多次,但定义只有一次。

6、函数的分文件编写
函数的分文件编写:将函数的声明放在头文件(.h)中,定义放在源文件(.c/.cpp)中,以实现模块化代码组织与复用。

①main.cpp

②swap.cpp

③swap.h

运行三个文件代码:按 F5(调试运行)或 Ctrl + F5(不调试运行)
九、指针
指针:一个变量,它存储的是另一个变量的内存地址,通过该地址可以直接访问或修改内存中的数据。
语法:数据类型 * 变量名;
①内存中的地址编号从0开始,一般是十六进制表示。
②可以使用指针变量保存地址。
1、指针的定义和使用

2、指针所占的内存空间
指针也是一个数据类型,在32位系统中指针占用的内存大小是4个字节,64位系统中占用的内存大小是8个字节。

3、空指针和野指针
空指针:值为 NULL 或 nullptr 的指针,明确指向“地址 0”,不指向任何有效内存。
int *p = NULL;
野指针:指向已被释放的内存、未初始化或指向无效地址的指针,其值是随机的、不确定的。
int *p; (未初始化的指针)
int *p = (int *)0x1100;(没有申请的内存空间,没有访问权限)
⚠️注意:
①0~255之间的内存编号是系统占用的,所以空指针指向的内存空间不可以访问。
②野指针指向的空间是非法的内存空间,也不可以访问。
③空指针和野指针不是我们申请的内存空间,只有我们申请的空间才可以访问。
4、const修饰指针

常量指针:指针指向的值不可以修改,指针的指向可以修改。
const int *p = &a;
指针常量:指针的指向不可以修改,指针指向的值可以修改。
int * const p = &a;
const修饰指针和常量:指针的指向和指针指向的值都不可以修改。
const int * const p = &a;
![]()
5、指针和数组
指针和数组:使用指针访问数组中的元素。

6、指针和函数
指针和函数:使用指针作为函数的参数,可以修改实参的值。

7、指针、数组、函数
案例:封装一个函数,使用冒泡排序,实现对整型数组的降序排序(从大到小)。

十、结构体
结构体:一种用户自定义的数据类型,允许将多个不同类型的数据项(成员变量)组合成一个整体,通过单个名称进行管理。
1、结构体定义和使用

2、结构体数组
结构体数组:将多个相同结构体类型的变量以数组形式连续存储,便于批量管理具有相同复合数据结构的对象集合。

3、结构体指针
结构体指针:指向结构体变量的指针,通过箭头操作符 -> 间接访问结构体成员,常用于高效传递大数据或动态链表操作。

4、结构体嵌套结构体
结构体嵌套结构体:在一个结构体的成员中定义另一个结构体类型的变量,用于表示更复杂的层级关系(如“人”包含“出生日期”这一结构体)。

5、结构体做函数参数
结构体做函数参数:可以将整个结构体变量(值传递)或其指针(地址传递)传入函数,实现对结构体成员数据的读取或修改。
传递方式:①值传递 ②地址传递

6、结构体中const使用场景
结构体中const使用场景:使用const防止误操作。

7、结构体案例
(1)案例1


(2)案例2

升序排序(从小到大)

十一、通讯录管理系统
有待解锁!!!

更多推荐

所有评论(0)