1 C++初识
1.1 编写C++程序步骤
四个:创建项目、创建文件、编写代码、运行程序
1.2 注释
单行注释://描述信息 (通常放在一行代码的上方,或者一条语句的末尾)
多行注释:/描述信息/ (通常放在一段代码的上方)
1.3 变量
作用:给一段指定的内存空间起名,方便操作这段内存
1.4 常量
作用:用于记录程序中不可更改的数据
C++定义常量的两种方式:
①#define 宏常量:#define 常量名 常量值 (通常在文件上方定义,表示一个常量)
②const修饰的变量:const 数据类型 常量名 = 常量值 (通常在变量定义前加关键字const,修饰该变量为常量,不可更改)
1.5关键字
作用:C++中预先保留的单词(标识符)
1.6 标识符命名规则
给变量起名时,力求见名知意
2 数据类型
意义:给变量分配合适的内存空间
2.1 整型
作用:表示整数类型的数据
根据所占内存空间不同,有短整型short、整型int、长整型long、长长整型long long四种。
2.2 sizeof关键字
作用:统计数据类型所占的内存大小
语法:sizeof(数据类型/变量)
2.3 实型(浮点型)
作用:表示小数
浮点型变量有两种:单精度float、双精度double。二者区别在于表示的有效数字范围不同,float占用4字节,7位有效数字;double占用8字节,15-16位有效数字。
注意:1.定义数据类型是单精度float时,在初始值后要加f,因为默认是双精度的;2.不管输入的初始值是多少位有效数字,只能显示6位有效数字,这是count的问题,count有默认的输出位数,想输出小数点后14位要另外设置count输出精度。
2.4 字符型
作用:字符型变量用于显示单个字符
语法:char ch = ‘a’ ;
注意:1.用单引号而非双引号;2.单引号内只能有一个字符,不能是字符串;3.字符变量只占用1个字节,且不是把字符本身放到内存中存储,是将对应的ASCII编码放到存储单元。
2.5 转义字符
作用:表示一些不能显示出来的ASCII字符
常用的有 \n,\\, \t
2.6 字符串型
作用:用于表示一串字符
两种风格:
①C风格字符串:char 变量名[] = “字符串值”
②C++风格字符串:string 变量名 = “字符串值”
注意:C++风格的需要包含string的头文件
2.7 布尔类型bool
作用:代表真或假的值
bool类型只有两个值:true——真(1);false——假(0)
占1个字节大小
2.8数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin >> 变量
3 运算符
作用:用于执行代码的运算
3.1算术运算符
作用:用于处理四则运算
3.2 赋值运算符
作用:用于将表达式的值赋给变量
=、+=、-=、*=、/=、%=
3.3 比较运算符
作用:用于表达式的比较,并返回一个真值或假值
==、!=、<、>、<=、>=
3.4 逻辑运算符
作用:用于根据表达式的值返回真值或假值
&&与、||或、!非
4 程序流程结构
C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构
4.1 选择结构
4.1.1 if语句
三种形式:单行格式、多行、多条件、嵌套
4.1.2 三目运算符
作用:通过三目运算符实现简单的判断
语法:表达式1 ?表达式2 :表达式3
若表达式1的值为真,执行表达式2,并返回表达式2的结果;反之,执行表达式3,并返回表达式3的结果。
注:在C++中,三目运算符返回的是变量,可以继续赋值
4.1.3 switch语句
作用:执行多条件分支语句
switch、case、break、default
注:
1.case里如果没有break,那么程序会一直向下执行;
2.与if语句相比,switch在判断时,只能是整型或者字符型,而不能是一个区间;在多条件判断时,switch结构清晰,执行效率高。
4.2 循环结构
4.2.1 while循环语句
作用:满足循环条件,执行循环语句
注意:在写循环条件时一定要注意避免死循环的出现
4.2.2 do···while循环语句
作用:满足循环条件,执行循环语句
语法:do(循环语句)while(循环条件)
注意:与while的区别在于do···while会先执行一次循环语句,再判断循环条件
水仙花数案例练习:
获取个位:取模于10
获取十位:先整除于10,再取模于10
获取百位:整除于100
4.2.3 for循环语句
语法:for(起始表达式;条件表达式;末尾循环体){循环语句;}
执行顺序:0123123123···
4.2.4 嵌套循环
4.3 跳转语句
4.3.1 break语句
作用:用于跳出选择结构或者循环结构
使用时机:①出现在switch条件语句中,作用是终止case并跳出switch;②出现在循环语句中,作用是跳出当前的循环语句;③出现在嵌套循环中,跳出最近的内层循环语句。
4.3.2 continue语句
作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
注意:break会退出循环,而continue不会
4.3.3 goto语句
作用:可以无条件跳转语句
注意:不推荐使用,以免造成程序流程混乱。
5 数组
5.1 概述
几个集合,里面存放了相同类型的数据元素
特点:①数组中的每个数据元素是相同的数据类型;②数组是由连续的内存位置组成的
5.2 一维数组
5.2.1一维数组定义方式
三种方式:
①数据类型 数组名[数组长度];
②数据类型 数组名[数组长度] = {值1,值2,···};
③数据类型 数组名[ ] = {值1,值2,···};
注意:①数组名的命名规范与变量名命名规范一致,不要和变量重名;②数组中下标是从0开始索引。
5.2.2一维数组数组名
用途:
①可以统计整个数组在内存中的长度;
整个数组所占用的内存空间大小为sizeof(arr)
数组元素个数为sizeof(arr)/sizeof(arr[0])
②可以获取数组在内存中的首地址。(数组名等于数组首地址)
第一个元素的地址为(int)&arr[0] (&为取地址符号)
注意:数组名是常量,不可以进行赋值操作。
练习案例:五只小猪称体重,数组元素逆置
5.2.3冒泡排序
作用:最常用的排序算法,对数组内元素进行排序
1.比较相邻的元素,如果第一个比第二个大,则交换;
2.对每一对相邻的元素做同样的工作,执行完毕后,找到第一个最大值;
3.重复以上步骤,每次比较次数-1,直到不需要比较。
5.3 二维数组
5.3.1二维数组定义方式
在定义二维数组时,如果初始化了数据,可以省略行数
5.3.2二维数组数组名
作用:查看二维数组所占内存空间,获取二维数组首地址
5.3.3二维数组案例-考试成绩统计
6 函数
6.1 概述
作用:将一段经常使用的代码封装起来,减少重复代码
通常,一个较大的程序会分为若干个程序块,每个模块实现特定的功能。
6.2 函数的定义
一般有5个步骤:
1)返回值类型(一个函数可以返回一个值)
2)函数名;
3)参数列表(使用该函数时,传入的数据)
4)函数体语句;
5)return表达(函数执行完后,返回相应的数据)
6.3 函数的调用
功能:使用定义好的函数
语法:函数名(参数)
注:函数定义里小括号内称为形参,函数调用时传入的参数为实参
6.4 值传递
所谓值传递,就是函数调用时实参将数值传入给形参
值传递时,如果形参发生任何改变,并不会影响实参
6.5 函数的常见样式
常见的有4种:无参无返;有参无返;无参有返;有参有返
6.6 函数的声明
作用:告诉编译器函数名称及如何调用函数,函数的实际主体可单独定义。
函数的声明其实就是编译器不智能(顺序执行/不同的文件夹)的BUG存在
main函数放前面要声明
注意:函数的声明可以有多次,但是函数的定义只能有一次。
6.7 函数的分文件编写
作用:让代码结构更加清晰
一般有四个步骤:
1)创建后缀名为.h的头文件;
2)创建后缀名为.cpp的源文件;
3)在头文件中写函数的声明;
4)在源文件中写函数的定义。
7 指针 7.1 基本概念
指针的作用:可以通过指针间接访问内存(地址编号)
内存编号是从0开始记录,一般用十六进制数字表示;可以利用指针变量保存地址。
指针就是地址
7.2 指针变量的定义和使用
定义:数据类型 * 指针变量名
指针变量和普通变量的区别:普通变量存放的是数据,指针变量存放的是值的地址
使用:*p(解引用),可以操作指针变量指向的内存空间
指针声明必须指定指针指向的数据的类型
指针真正的用武之地在于在运行阶段分配未命名的内存以存储值
7.3 指针所占内存空间
指针也是一种数据类型,在32位操作系统下,占用4个字节空间,在64位操作系统下,占用8个字节
7.4 空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
内存编号为0-255为系统占用内存,不允许用户访问
野指针:指针变量指向非法的内存空间
总结:空指针和野指针都不是我们自己申请的空间,因此不要访问。
7.5 const修饰指针
const修饰指针有三种情况:
1)const 修饰指针——常量指针
const int * p = &a
特点:指针的指向可以修改,但是指针指向的值不可以更改
2)const 修饰常量——指针常量
int * const p = &a
特点:指针的指向不可以修改,但是指针指向的值可以更改
3)const 既修饰指针,又修饰常量
const int * const p =&a
特点:指针的指向及指向的值都不可以更改
7.6指针和数组
作用:利用指针访问数组中的元素
7.7指针和函数
作用:利用指针作函数参考,可以修改实参的值
注:值传递不可修改实参的值。
总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递。
7.8指针、数组、函数
封装一个函数,利用冒泡排序,实现对整型数组的升序排列
注:当数组名传入到函数作为参数时,被退化为指向首元素的指针
8 结构体 8.1 概念
结构体属于用户自定义的数据类型(一些类型集合组成的一个类型),允许用户存储不同的数据类型
8.2结构体的定义和使用
语法:struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种:
• struct 结构体名 变量名
• struct 结构体名 变量名 = {成员1值, 成员2值···}
• 定义结构体时顺便创建变量
注:
1.定义结构体时的关键字是struct,不可以省略
2.创建结构体变量时,关键字struct可以省略
3.结构体变量利用操作符“.”访问成员
8.3 结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名[元素个数]={ {},{},···,{} }
8.4 结构体指针
作用:通过指针访问结构体中的成员
利用操作符->可以通过结构体指针访问结构体属性(成员)
8.5 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
案例:每个老师辅导一个学生,一个老师的结构体中,记录一个学生的结构体
8.6 结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式:值传递;地址传递
注:在值传递中,实参不会发生改变,而在地址传递中,实参会发生改变。
8.7 结构体中const使用场景
作用:用const来防止误操作
使用场景:
将函数中的形参改为指针,可以减少内存空间,而且不会复制新的副本出来,加const防止函数体中的误操作,地址传递时修改内容
(常量指针不能修改值,但可以更改指针的指向)
PS:以上为黑马C++入门编程课程的笔记,如有错误恳请大家指正。