1.C++初识
1.1.初学必备头文件代码
- #include<iostream> //输入输出流头文件
- using namespace std;
#include "xx.h" //表示自定义的头文件
在自定义头文件中,会看到一行灰色代码 #pragma once 防止头文件重复包含
1.2.定义常量的两种方式
- #define 宏常量 如: #define Day 7
- const 修饰的变量 如: const int month = 12;
1.3.标识符命名规则
- 标识符不能是关键字
- 标识符由字母,数字,下划线组成
- 第一个字符为字母或者下划线
- 标识符中字母区分大小写
2.数据类型
2.1.利用sizeof关键字统计数据类型所占内存的大小 sizeof(数据类型 / 变量)
2.2.整型所占字节数大小比较:
short(2字节) < int(4字节) <= long(window下4字节,linux下8字节) <= long long(8字节)
各类取值范围为:-2^(字节数*8-1)~ (2^(字节数*8-1))-1 (正值取值减一的原因为减去0)
2.3.浮点型(单精度:float 双精度:doubl e)
float占4个字节,有效数字范围为7位(小数点前后一共7位)
double占8个字节,有效数字范围为15~16位
注:默认情况下,输出一个小数,会显示6位有效数字
2.4.科学计数法
float f1 = 3e2 // 表示 3*10^2
float f1 = 3e-2 // 表示 3*0.1^2
2.5.字符型
- 用于显示单个变量 语法: char ch = 'a';
- 只能用单引号括起来,不能用双引号,单引号内只能有一个字符
- 占1个字节
- 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放到存储单元中
- 输出字符对应的ASCII编码: cout << (int)ch <<endl; 利用强制转换变为int型
- 常见对应ASCII码: a - 97 A - 65 0 - 48
2.6.转义字符
C++中的换行操作为 endl,表示换行
换行符 \n 反斜杠 \\ 水平制表符 \t
2.7.字符串型
C风格字符串 char 变量名[ ] = “字符串值”;
C++风格字符串 string 变量名 = “字符串值”;
2.8.bool数据类型
true 真(本质是1) false 假(本质是0)
bool类型占1个字节大小
2.9.数据的输入和输出
数据的输出: cout << 变量; cout << 变量 << endl; endl代表换行
数据的输入:cin >> 变量;
3.运算符
运算符分为算术运算符,赋值运算符,比较运算符,逻辑运算符
3.1.算数运算符
+ - * /(结果为小数,会将小数部分去除) 正号 负号 %(取余) ++(前置递增与后置递增) --(前置递减与后置递减)
%:除数不可以为0;两个小数是不可以做取模运算的(C++规定)
前置递增 ++ a = 2, b = ++a; 结果为:a = 3, b = 3;
后置递增 ++ a = 2, b = a++; 结果为:a = 3, b = 2;
前置递减 -- a = 2, b = --a; 结果为:a = 1, b = 1;
后置递增 -- a = 2, b = a--; 结果为:a = 1, b = 2;
3.2.赋值运算符
= += -= *= /= %=
如:a += 2表示 a = a + 2;
3.3.比较运算符
== != < > <= >=
3.4.逻辑运算符
!(取反) &&(与 两真则为真,其余为假) ||(两假则为假,其余为真)
在C++中,除了0都为真 如: a=10,则 !a 的输出为0(假)
4.程序流程结构
4.1.顺序结构
按顺序执行
4.2.选择结构
4.2.1.if语句
if (条件) {执行语句}
if (条件) {执行语句} else {执行语句}
if (条件) {执行语句} else if {执行语句} else if {执行语句}...else{执行语句}
嵌套if 语句
4.2.2.三目运算符
语法: 表达式1 ?表达式2 :表达式3
解释:若表达式1的值为真,则执行表达式2,并返回表达式2的结果;若表达式1的值为假,则执行表达式3,并返回表达式3的结果;
在C++中,三目运算符返回的是变量,可以继续赋值
4.2.3. switch语句
语法:
switch(表达式){
case 结果1:执行语句;break;
case 结果2:执行语句;break;
......
default:执行语句;break;
}
switch的缺点:switch语句中表达式类型只能是整型或者字符型,不可以是一个区间
switch的优点:结构清晰,执行效率高
4.3.循环结构
4.3.1. while循环语句
语法:while(循环条件){循环语句;}
生成随机数的代码:
(1) 头文件中添加 #include<ctime>
(2) main函数中写入
srand((unsigned int) time(NULL));
int number = rand()%100 + 1; //生成1~100之间的随机数
4.3.2. do-while循环语句
语法:do{循环语句;}while(循环条件);
4.3.3. for循环语句
语法:for(起始表达式;条件表达式;末尾表达式){循环语句;
4.4.跳转语句
4.4.1 break语句
- 在switch语句中,作用是终止case并跳出switch
- 在循环语句中,作用是跳出当前的循环语句
- 在嵌套循环中,作用是跳出最近的内层循环语句
4.4.2 continue语句
在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
4.4.3 goto语句
语法:goto 标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置
5.数组
- 数组中每个数据元素都是相同的数据类型
- 数组是由连续的内存位置组成的
5.1.一维数组
5.1.1.一维数组定义方式
- 数据类型 数组名[数组长度];
- 数据类型 数组名[数组长度] = {值1,值2,值3...};
- 数据类型 数组名[ ] = {值1,值2,值3...};
数组元素的下标是从0开始索引的
数组名是常量,不可以进行赋值操作
5.1.2.一维数组名称的用途
- 可以统计整个数组在内存中的长度
- 可以获取数组在内存中的首地址
#include<iostream>
using namespace std;
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "数组占用的内存空间为:" << endl;
cout << sizeof(arr) << endl;
cout << "数组中每个元素占用的内存空间为:" << endl;
cout << sizeof(arr[0]) << endl;
cout << "数组中元素的个数为:" << endl;
cout << sizeof(arr) / sizeof(arr[0]) << endl;
cout << "数组的首地址为(16进制):" << endl;
cout << arr << endl;
cout << "数组中第一个元素的地址为:" << endl;
cout << &arr[0] << endl;
system("pause");
return 0;
}
5.2.二维数组
5.2.1.二维数组定义方式
- 数据类型 数组名 [行数][列数]
- 数据类型 数组名 [行数][列数] = {{数据1,数据2},{数据3,数据4}};
- 数据类型 数组名 [行数][列数] = {数据1,数据2,数据3,数据4};
- 数据类型 数组名 [ ][列数] = {数据1,数据2,数据3,数据4};
5.2.2.二维数组名称
int arr[2][3]={{1,2,3},{4,5,6}};
二维数组占用内存空间为:sizeof(arr)
二维数组一行占用内存空间为:sizeof(arr[0])
二维数组每个元素占用内存空间为:sizeof(arr[0][0])
二维数组的行数为:sizeof(arr) / sizeof(arr[0])
二维数组的列数为:sizeof(arr[0]) / sizeof(arr[0][0])
二维数组的首地址为:arr
二维数组第一行首地址:arr[0]
二维数组第二行首地址:arr[1]
二维数组第一个元素首地址:&arr[0][0]
6.函数
定义语法:返回值类型 函数名(参数列表){ 函数体语句; return 表达式;}
调用函数:函数名(参数)
值传递:函数调用时实参将数值传入给形参;值传递时,如果形参发生改变,并不会影响实参
函数的常见样式:无参无返 有参无返 无参有返 有参有返
函数的声明可以多次,但是函数的定义只能有一次
函数的分文件编写步骤:
- 创建后缀名为.h的头文件(如 swap.h)
- 创建后缀名为.cpp的源文件(swap.cpp,并在该源文件中引用头文件 #include "swap.h")
- 在头文件中写函数的声明
- 在源文件中写函数的定义
7.指针
7.1.指针的定义
指针的作用:可以通过指针间接访问内存
语法: 数据类型 * 指针变量名;
指针前加 * 代表解引用,表示找到指针指向的内存中的数据
int a = 10; int * p = &a;
指针也是种数据类型,在32位操作系统下,占用4个字节空间,64位操作系统下占用8个字节空间(不管什么数据类型,如int float double等)
7.2.空指针和野指针
7.2.1.空指针
空指针:指针变量指向内存中编号为0的空间
用途:初始化指针变量
注意:空指针指向的内存是不可以访问的
空指针定义: int * p = NULL;
内存编号0~255为系统占用内存,不允许用户访问
7.2.2.野指针
野指针:指针变量指向非法的内存空间
7.3.const修饰指针
- const修饰指针——常量指针
- const修饰常量——指针常量
- const即修饰指针,又修饰常量
例:int a = 10; int b = 10; int * p = &a;
若 const int * p = &a; 常量指针
常量指针特点:指针的指向可以修改,但指针指向的值不可以改。
例如: *p = 20;错误,不可以改指向的值
p = &b; 正确,指针指向可以修改
若 int * const p = &a; 指针常量
指针常量特点:指针的指向不可以改,指针指向的值可以改。
例如: *p = 20;正确 可以修改指向的值
p = &b;错误 不可以修改指针的指向
若 const int * const p = &a; const即修饰指针,又修饰常量
特点:指针的指向和指针指向的值都不可以改
例如: *p = 20;错误 p = &b; 错误
7.4.指针和数组
利用指针访问数组中的元素:
int arr[5] = {1,2,3,4,5};
int * p = arr;
则指针访问数组中第一个元素为 *p; 进行p++操作后,第二个元素则为*p
7.5.指针和函数
利用指针做函数参数,可以修改实参的值
8.结构体
8.1.结构体的定义
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
语法: struct 结构体名 { 结构体成员列表 };
通过结构体创建变量的方式有三种
- struct 结构体名 变量名
- struct 结构体名 变量名 = {成员1值,成员2值...}
- 定义结构体是顺便创建变量
创建案例:
struct Student
{
string name;
int age;
double score;
}
struct Student stu1; //创建变量时struct关键字可以省略 即 Student stu1;
stu1.name=" das "; ...
8.2.结构体数组
语法: struct 结构体名 数组名[元素个数] = { {},{},...,{} }
8.3.结构体指针
作用:通过指针访问结构体中的成员
利用操作符 -> 可以通过结构体指针访问结构体属性
struct Student * p = &stu1;
p -> name = " aas";
8.4.结构体嵌套结构体
struct teacher
{
string name1;
struct Student stu2;
}
调用学生属性时: teacher t; t.stu2.name;
8.5.结构体做函数参数
将结构体作为参数向函数中传递,有值传递和地址传递两种方式
如打印结构体中的数据:值传递: void print (struct Student stu) { }
地址传递: void print (struct Student * stu) { }
8.6.结构体中const使用场景
作用:用const来防止误操作
如 : 地址传递: void print (const struct Student * stu) { } //加入const之后,一旦有修改的操作就会报错,可以防止我们的误操作