一、初识C++
1. 变量
**作用:**给一段指定的内存空间起名,方便操作这段内存
语法:数据类型 变量名 = 初始值
#include<iostream>
using namespace std;
int main() {
int a = 10;
cout << "a = " << a << endl;
system("pause");
return 0;
}
2. 常量
**作用:**用于记录程序中不可修改的数据
C++定义常量两种方式:
- #define 宏常量:
define 常量名 常量值
- const 修饰的变量
const 数据类型 常量名 = 常量值
- 通常在变量定义前加关键字const,修饰该变量为常量,不可修改。
#define day 7
int main() {
cout << "一周共有 " << day << "天" << endl;
system("pause");
return 0;
}
int main() {
const int month = 12;
cout << "本月还剩 " << month << "天" << endl;
system("pause");
return 0;
}
二、数据类型
C++规定再创建一个变量或者常量时必须要指定出相应的数据类型,否则无法给变量分配内存。
数据类型存在的意义:给变量分配一个合适的内存空间,不大也不小。
1. 整型
C++中能够表示整型的类型有以下几种方式,区别在于所占空间不同。
数据类型 | 所占空间 | 取值范围 |
---|---|---|
short(短整型) | 2字节 | ( − 2 15 -2^{15} −215~ 2 15 − 1 2^{15}-1 215−1)=(-32768 ~ 32767) |
int(整型) | 4字节 | ( − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1) |
long(长整型) | win 4字节 | ( − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1) |
long long(长长整型) | 8字节 | ( − 2 63 -2^{63} −263~ 2 63 − 1 2^{63}-1 263−1) |
正数越界会变成负数,负数越界变成正数
2. sizeof关键字
**作用:**可以统计数据类型所占内存的大小
语法:sizeof(数据类型/变量)
实例:
int main() {
short num1 = 10;
int num2 = 10;
long num3 = 10;
long long num4 = 10;
cout << "shor sizeof=" << sizeof(num1) << endl;
cout << "int sizeof=" << sizeof(num2) << endl;
cout << "long sizeof=" << sizeof(num3) << endl;
cout << "long long sizeof=" << sizeof(num4) << endl;
system("pause");
return 0;
}
3. 实型(浮点型)
**作用:**用于表示小数
浮点型变量分为两种:
- 单精度 float
- 双精度 double
两者的区别在于表示的有效数字范围不同。
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4字节 | 7位有效数字 |
double | 8字节 | 15~16位有效数字 |
- 默认情况下输出一个小数,会显示出6位有效数字。无论是float还是double。
int main() {
float f1 = 3.1415926f;
double f2 = 3.1415926;
cout <<f1<< endl;
cout <<f2 << endl;
system("pause");
return 0;
}
int main() {
float f1 = 3.14f;
double f2 = 3.14;
cout << "sizeof(float)=" << sizeof(f1) << endl;
cout << "sizeof(double)=" << sizeof(f2) << endl;
system("pause");
return 0;
}
-
使用科学计数法来表示小数
int main() { float f1 = 3e-2; //3*0.1^2 float f2 = 3e2; //3*10^2 cout <<f1<< endl; cout <<f2 << endl; system("pause"); return 0; }
语法:
- e后面跟正数代表10^的几次方
- e后面跟负数代表0.1^的几次方
4. 字符型
**作用:**字符型变量用于显示单个字符
语法:char ch = 'a'
注意:
-
在显示字符型变量时,用单引号将字符括起来,不要用双引号(用双引号是字符串)
-
单引号内只能有一个字符,不可以是字符串
-
C和C++中的字符型变量只占一个字节。
-
字符型变量并不是把字符本身放到内存中存储,而是将相应的ASCII编码放到存储单元中
int main() { // 看到字符型变量对应的ASCII编码 char ch = 'A'; cout << (int)ch << endl; //(int)是强制类型转换 system("pause"); return 0; }
常识:常见字母对应的ASCII码
- A-65
- a-97
5. 转义字符
-
换行符\n
C++中的换行符是endl,和C中的"\n"效果一样:
int main() { cout << "hello world!" << endl; //C++ cout << "hello world!\n"; //C system("pause"); return 0; }
6. 字符串型
**作用:**用于表示一串字符
C++中有两种风格的字符串:
-
延续C风格的字符串:
char 变量名[] = "字符串值"
注意事项:
- 别忘记加中括号
- 等号后面要用双引号包含起来字符串
示例:
int main() { char str1[] = "hello world!"; string str2 = "hello world!!"; cout << str1 << endl; cout << str2 << endl; system("pause"); return 0; }
-
C++风格字符串:
string 变量名 = "字符串值"
注意事项:
- 别忘记头文件要有:#include
7. 布尔数据类型
**作用:**布尔数据类型代表真或假的值
bool类型只有两个值:
- true:真(本质是1)
- false:假(本质是0)
bool类型只占1个字节的大小
C++中布尔类型只要非0的值都代表真
8. 数据的输入
**作用:**用于从键盘获取数据
**关键字:**cin
语法:cin >> 变量
实例:
int main() {
//整型输入
int a = 0;
cout << "请输入整型变量" << endl;
cin >> a;
cout << a << endl;
//字符串型输入
string str = "";
cout << "请输入字符串变量" << endl;
cin >> str;
cout << str << endl;
system("pause");
return 0;
}
三、运算符
跟C一摸一样,运算逻辑也是
四、程序流程结构
选择、循环、跳转
跳转有一个goto语句
**作用:**可以无条件跳转语句
语法:goto 标记
- 标记一般用大写字母表示。
**解释:**如果标记的名称存在,执行到goto语句时会跳转到标记的位置
int main() {
cout << "1" << endl;
goto FLAG;
cout << "2" << endl;
cout << "3" << endl;
cout << "4" << endl;
FLAG:
cout << "5" << endl;
system("pause");
return 0;
}
五、数组
1. 概述
数组:是一个集合,里面存放了相同类型的数据元素
特点:
- 数组中的每个数据元素都是相同的数据类型
- 数组是由连续的内存位置组成的
2. 一维数组
5.2.1 一维数组的定义方式
有三种:
数据类型 数组名[数组长度];
数据类型 数组名[数组长度] = {值1,值2,...};
数据类型 数组名[] = {值1,值2,...}
通过下标访问数组元素。
5.2.2 数组名用途
-
通过数组名查看数组首地址
int main() { int arr[5] = { 10,9,8,7,6 }; cout << arr << endl; system("pause"); return 0; }
0000004D290FF668
-
通过数组名统计整个数组占用内存大小
int main() { int arr[5] = { 10,9,8,7,6 }; cout << sizeof(arr) << endl; cout << sizeof(arr[0]) << endl; cout << sizeof(arr) / sizeof(arr[0]) << endl; system("pause"); return 0; }
3. 二维数组
二维数组定义的四种方式:
数据类型 数组名[行数][列数];
数据类型 数组名[行数][列数] = {{1,2},{3,4}};
数据类型 数组名[行数][列数] = {数据1,数据2,数据3,数据4,...};
数据类型 数组名[][列数] = {数据1,数据2,数据3,数据4};
建议使用第二种,使代码更直观。
六、函数
1. 概述
**作用:**将一段经常使用的代码封装起来,减少重复代码
2. 函数的定义
函数的定义一般有5个重要步骤:
- 返回值类型
- 函数名
- 参数列表
- 函数体语句
- return表达式
语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return 表达式
}
3. 值传递
- 所谓的值传递,就是函数调用时将实参值传入给形参
- 值传递时,如果形参发生改变并不会影响实参
4. 函数声明
声明可以写多次,但是定义只能有一次。
5. 函数的份文件编写
**作用:**让代码结构更加清晰
函数分文件编写一般有四个步骤:
- 创建后缀名为.h的头文件
- 创建后缀名为.cpp的源文件
- 在头文件中写函数的声明
- 在源文件中写函数的定义
示例:
七、指针
1. 基本概念
**作用:**可以通过指针间接访问内存
- 内存编号是从0开始记录的,一般用十六进制数字表示
- 可以利用指针变量保存地址
2. 指针变量的定义和使用
指针变量定义语法:数据类型 *变量名;
示例:
int main() {
int a = 10;
int* a1 = &a;
cout << a1 << endl;
return 0;
}
指针的使用:通过解引用的方式来找到指针指向的内存,可以通过指针前加*。
int main() {
int a = 10;
int* a1 = &a;
cout << *a1 << endl;
return 0;
}
3. 指针所占空间
指针也是一种数据类型,那么他所占空间是多少?
在32位操作系统下,不论是什么类型的指针都站4个字节。
在64位操作系统下,不论是什么类型的指针都站8个字节。
int main() {
int a = 10;
int* a1 = &a;
cout << sizeof(a1) << endl;
return 0;
}
4. 空指针和野指针
**空指针:**指针变量指向内存中编号为0的空间(因为这块空间是系统占用的)
int* p = NULL;
**用途:**初始化指针变量
**注意:**空指针指向的内存是不可以访问的
**野指针:**指针变量指向非法的内存空间
int main() {
int* p = (int*)0x1100;
//访问野指针报错
cout << *p << endl;
return 0;
}
5. const 修饰指针
const修饰指针有三种情况:
-
const修饰指针 --常量指针
特点:
-
指针的指向可以修改,但是指针指向的值不可以修改。
-
const int* p = &a;
此时:
*p = 20
错误p = &b
正确
-
-
const修饰常量 --指针常量
特点:
-
指针的指向不可以修改,指针指向的值可以修改。
-
int* const p = &a;
此时:
*p = 20
正确p = &b
错误
-
-
const即修饰指针,又修饰常量
特点:
-
指针的指向和指向的值都不可以修改。
-
const int* const p = &a;
此时:
*p = 20
错误p = &b
错误
-
6. 指针和数组
利用指针访问数组中的元素。
int main() {
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
//数组名就代表数组的首地址,也就是第一个元素的地址
cout << "arr=" << arr << endl;
cout << "p=" << p << endl;
return 0;
}
使用指针访问数组第一个元素:
-
方式一:
cout << "arr[0]=" << p[0] << endl;
-
方式二:
cout << "arr[0]=" << *p << endl;
使用指针访问数组第二个元素:
-
方式一:
cout << "arr[1]=" << p[1] << endl;
-
方式二:
p++; cout << "arr[1]=" << *p << endl;
此时是让指针向后偏移了4个字节
7. 地址传递
将参数中的形参改为指针,可以减少内存空间,而且不会赋值新的副本出来。
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 10;
int b = 20;
swap(&a, &b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
八、结构体
1. 基本概念
结构体书关于用户自定义的数据类型,允许用户存储不同的数据类型
2. 结构体定义和使用
语法:struct 结构体名{结构体成员列表};
例如:
//结构体定义
struct student {
//成员列表
string name;
int age;
int score;
string sex;
};
通过结构体创建变量的方式有三种:
注意:C++创建变量时struct关键字可以省略。
-
struct 结构体名 变量名
-
struct student s1; s1.name = "张三"; s1.age = 12; s1.score = 99; s1.sex = "男";
-
cout << "姓名:" << s1.name << "年龄:" << s1.age << "性别:" << s1.sex;
-
-
struct 结构体名 变量名 = {成员1值,成员2值...}
-
struct student s2 = {"李四",19,80,"女"};
-
cout << "姓名:" << s2.name << "年龄:" << s2.age << "性别:" << s2.sex << endl;
-
-
定义结构体时顺便创建变量
-
//结构体定义 struct student { //成员列表 string name; int age; int score; string sex; }s3;
-
**访问结构体变量属性:**通过"."来访问
s1.name
3. 结构体数组
**作用:**将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名[元素个数] = {{},{},{},...{}}
示例:
-
创建结构体数组
struct student arr[3] = { {"张三",12,99,"男"}, {"李四",13,44,"男"}, {"王五",15,32,"女"} };
-
遍历结构体数组
for (int i = 0; i < 3; i++) { cout << "姓名:" << arr[i].name << "年龄:" << arr[i].age << "分数:" << arr[i].score << "性别:" << arr[i].sex << endl; }
4. 结构体指针 ->
**作用:**通过指针访问结构体中的成员
- 利用操作符
->
可以通过结构体指针访问结构体属性
示例:
student* p = &arr[0];
cout << "姓名:" << p->name << "年龄:" << p->age << "分数:" << p->score << "性别:" << p->sex;
5. 结构体做函数参数
**作用:**将结构体作为参数向函数中传递
传递方式有两种:
-
值传递
void printStudent(student stu) { cout << "姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << "性别:" << stu.sex; } main(){ printStudent(arr[2]); }
-
地址传递
void alertName(student* stu) { stu->name = "嘎嘎"; } main(){ alertName(&arr[2]); cout << arr[2].name; }
6. 结构体中const使用场景
**作用:**用const来防止误操作
1101211957685" style="zoom: 67%;" />5. 结构体做函数参数
**作用:**将结构体作为参数向函数中传递
传递方式有两种:
-
值传递
void printStudent(student stu) { cout << "姓名:" << stu.name << "年龄:" << stu.age << "分数:" << stu.score << "性别:" << stu.sex; } main(){ printStudent(arr[2]); }
-
地址传递
void alertName(student* stu) { stu->name = "嘎嘎"; } main(){ alertName(&arr[2]); cout << arr[2].name; }
6. 结构体中const使用场景
**作用:**用const来防止误操作