本学习笔记是本人在学习B站中 黑马程序员匠心之作—C++教程从0到1入门编程 时所写,若有错误,还希望大佬们可以留言指出。
学习视频地址:https://www.bilibili.com/video/BV1et411b73Z/?spm_id_from=333.999.0.0
C++初识
基本框架
#include<iostream>
#include<string>
using namespace std; //需要加分号
int main()
{
cout<<”hello world”<< endl; //输出
system(“pause”); //按任意键继续
return 0;
}
注释
单行注释://
多行注释:/* 内容 */
变量
意义:方便管理内存空间
定义方式:数据类型 变量名=变量初始值;eg:int a=10
常量
常量的定义方式有两种:
- 宏常量:通常定义在文件上方
定义方式:#define Day(常量名) 7(常量值) - const 修饰的变量也为常量
定义方式:const int a=10;
注意:常量不可以进行修改
关键字
关键字是C++预先保留的单词 ,在定义变量或常量时,不可使用关键字
标识符
- 标识符不能是关键字
- 标识符只能是数字、字母、下划线
- 标识符得第一个字符必须是字母或下划线
- 标识符中的字母区分大小写
数据类型
C++规定在创建一个变量或常量时,必须要指定相应的数据类型,否则无法给变量分配内存。
数据类型存在的意义:给变量分配合适的内存空间。
sizeof关键字
作用:统计数据类型所占内存空间
用法:sizeof(数据类型/变量) eg:sizeof(float);
整型
整形总共有4种:
| 短整型 | short | 2字节 | -215~215-1
| 整形 | int | 4字节 | -231~231-1
| 长整型 | long | windows为4字节;Linux为4字节(32位操作系统),8字节(64位操作系统) | -231~231-1
| 长长整形 | longlong | 8字节 | -263~263-1
实型(浮点型)
用于表示小数
默认会显示出6位有效数字
| 单精度 | float | 4字节 | 7位有效数字
| 双精度 | double | 8字节 | 15~16位有效数字
float f1=3.14f (编辑器会默认把小数当作一个双精度,用float去接收该小数时,会多一步转换过程,所以需要在小数后面加一个f,告诉编辑器该数是一个单精度)
科学计数法: float f2 = 3e2,即3102 ; float f3 =3e-2; 即310(-2)
字符型
用于显示单个字符,占一个字节。
定义方式:char ch= ’a’ ;
注意:用单引号将字符括起来,不是双引号,且单引号内只能有一个字符,不可以是字符串。
字符型变量并不是将字符本身放到内存中存储,而是将对应的ASCII码放入存储单元。
对应的ASCII码 a-97 A-65
转义字符
用于表示一些不能显示出来的ASCII字符
\n 换行
\ 反斜杠
\t 水平制表符: 整齐的输出数据
字符串型
用于表示一串字符
有两种风格:
1. C语言风格:char 变量名[] =”字符串值”
2. C++风格: string 变量名=”字符串值” 需加头文件(#include)
布尔类型
布尔类型bool:代表真或假的值,只占一个字节的内存
只有两个值: true–本质是1 false–本质是0
数据的输入
用于从键盘获取数据
关键字 cin eg:cin >> 变量
运算符
算术运算符
四则运算:加减乘除
整数相除,结果仍为整数,小数部分去除;两个小数相除,结果也可以为小数。
取模运算 % :两个小数之间不可以做取模运算;只有整形变量可以做取模运算
递增递减 :a++ ++a 都是让变量加1
++a先自加再运算 a++先运算再自加
eg:a=10 b=(a++)*10 , c=(++a)*10 b=100 , c=110
赋值运算符
将表达式的值赋给变量
主要有:= 、 += 、 *= 、 /= 、 %=
(a+=2 等价于a=a+2) , (a/=2 等价于a=a/2)
比较运算符
表达式的比较 并返回一个真值(1)或假值(0)
主要有:== 、 != 、 < 、 > 、 <= 、 >=
逻辑运算符
根据表达式的值返回真值或假值
! 非 eg: !a 若a为假,则 !a 为真; 若a为真,则 !a 为假 。
&& 与 eg: a&&b a,b同时为真,结果为真,否则为假。
|| 或 eg: a||b a,b有一个为真,结果为真;二者都为假,结果为假。
在C++中,只要不是0,都为真。
程序流程结构
顺序结构
程序按顺序执行,不发生跳转
选择结构
依据条件是否满足,有选择的执行相应的功能
if语句
三目运算符
表达式1?表达式2:表达式3 (1为真,则执行2;1为假,则执行3。)
Switch语句
执行多条件分支语句 执行效率高,表达式类型只能是整形或字符型。
Switch(表达式)
{
Case 结果1: 执行语句; break;
Case 结果2: 执行语句; break;
···
Default: 执行语句; break;
}
循环结构
依据条件是否满足,循环多次执行某段代码;在写循环时,一定要注意不要写成死循环。
While循环
do-While循环
for循环
嵌套循环
跳转语句
break语句
用于跳出选择结构或循环结构。
- 出现在switch条件语句中,终止case并跳出switch
- 出现在循环语句中,跳出当前的循环语句
- 出现在嵌套语句中,跳出最近的内层循环语句
continue语句
在循环语句中,跳过本次循环中余下的尚未执行的语句,继续执行下一次的循环。
可以用来筛选条件,执行到此就不在向下执行,指向下一次的循环。
goto语句
无条件跳转语句,跳到标记语句。
只做了解,一般不用。
数组
所谓数组,就是一个集合里面放了许多相同类型的数据元素。
特点:1. 数组中每个数据元素都是相同的数据元素
2. 数组是由连续的内存位置组成的
一维数组
定义方式共有三种:
1. 数据类型 数组名 [ 数组长度 ];
2. 数据类型 数组名 [ 数组长度 ] = {值1,值2,···};
3. 数据类型 数组名 [ ] = {值1,值2,···};
若在初始化时,没有全部赋值,则剩余的会用0补充。
一维数组名称的用途:
1. 可以统计整个数组在内存中的长度;eg:sizeof(arr)
2. 可以获取数组在内存中的首地址;eg:cout<< arr <<endl;(16进制 可以在arr前加int 进行强制转换为十进制)
3. 可以获数组中第一个元素的地址;eg:cout<<(int)&arr[0]<<endl;
4. 数组名是一个常量,不可以进行赋值操作。eg:arr=100;(×)
冒泡排序
对数组内元素进行排序。
步骤:1.比较相邻元素,若第一个比第二个大,就交换
2. 对每一对相邻元素做同样的工作,执行完毕,找到第一个最大值
3. 重复以上步骤,每次比较次数-1,直至不需要比较
排序的总轮数=元素个数-1;
每轮对比次数=元素个数-排序轮数-1;
二维数组
在一维数组上,多加一个维度
定义方式共有四种:
1. 数据类型 数组名 [行数] [列数];
2. 数据类型 数组名 [行数] [列数]={ {数据1,数据2} , {数据3,数据4} };
3. 数据类型 数组名 [行数] [列数]={数据1,数据2,数据3,数据4};
4. 数据类型 数组名 [] [列数]={数据1,数据2,数据3,数据4};
二维数组数组名的用途:查看二维数组所占内存空间;获取二维数组首地址
外层循环打印行数,外层循环打印列数
函数
函数可以概括成两个字就是封装。
框架
返回值类型 函数名 (参数列表)
{
函数体语句;
return 表达式; //void型不需要return
}
常见的函数样式
值传递时,函数的形参发生改变,并不会影响实参;
地址传递时,函数的实参会发生改变。
函数的分文件编写
- 创建一个.h的头文件
- 创建一个.cpp的源文件
- 在头文件中写函数声明以及该有的头文件
函数声明 :返回值类型 函数名 (参数列表)
该有的头文件,例如,#include / using namespace std; 等 - 在源文件中写函数定义 同时要写一个自定义的头文件 #include ”swap.h”
指针
指针就是地址
作用:通过指针间接访问内存
内存编号从0开始记录且一般使用十六进制数字表示,可以利用指针变量保存地址。
32位操作系统下,占4字节;64位操作系统下,占8字节。(不管是什么类型)
定义:数据类型 * 指针变量;
//第一种
int a=10;
int * p;
p=&a; //让指针记录变量a的地址
//第二种:
int a=10;
int *p=&a;
*通过解引用的方式找到指针指向的内存,即 p
空指针
针变量指向内存编号为0的空间 eg:int * p=NULL;
用途:初始化指针变量
空指针指向的内存是不可以访问的,因为0~255之间的内存编号是系统占用的
野指针
指针变量指向非法的内存空间
int * p=(int *)0x1100;
程序中要尽量避免野指针
const修饰指针
-
const修饰指针—常量指针;
const int * p=&a;
指针指向可以修改但指针指向的值不可以修改
*p=20(错误,值不可以改) p=&b(对,指针指向可以修改) -
const修饰常量–指针常量;
int * const p =&a;
指针指向不可以修改,指针指向的值可以改 -
const即修饰指针,又修饰常量
const int * const p = &a;
指针指向和指针指向的值都不可以修改
指针和数组
利用指针来访问数组中的元素
int * p=arr; //数组名就是数组的首地址
p++; //让指针向后偏移四个字节
指针和函数
利用指针作函数参数,可以修改实参的值
想要改变实参就用地址传递,不想改变就用值传递
指针 数组 函数
结构体
用户自定义的数据类型,允许用户存储不同的数据类型
语法:struct 结构体名称 {结构体成员列表};
创建变量的三种方式:
1. struct 结构体名 变量名
2. struct 结构体名 变量名={成员值1,成员值2,···}
3. 定义结构体时顺便创建变量
结构体定义时,struct不可以省略;创建变量时,可以省略。
结构体变量利用“.”来访问。
结构体数组
将自定义的结构体放入数组中方便维护
语法:struct 结构体名 数组名[元素个数]={ {}, {}, {},····,{} }
结构体指针
通过指针访问结构体中的成员
利用操作符->可以通过结构体指针访问结构体属性
结构体嵌套结构体
结构体中的成员可以是另一个结构体
结构体做函数参数
将结构体作为参数向函数中传递
传递方式:值传递、地址传递
将函数中的形参改为指针(即地址传递),可以减少内存空间,而且不会复制出新的副本,但地址传递会改变实参的值,为防止有误操作的行为,可以在形参前加上const关键字。
结构体中const使用场景
用 const 来防止误操作
案例1
案例2