目录
1.C++基础
1.1 C++基本框架
#include <iostream>
using namespace std;
int main()
{
system("pause");
return 0;
}
书写hello world示例:
#include <iostream>
using namespace std;
/*
main是一个程序的入口
每个程序都必须有这么一个函数
有且只有一个
*/
int main()
{
cout <<"hello world"<< endl;//含义:输出hello world;
system("pause");
return 0;
}
1.2 注释
两种格式
1.单行注释:
//描述信息
通常放在一行代码的上方或者一条语句的末端,对该行进行说明。
2.多行注释:
/*描述信息*/
通常放在一段代码的上方,对该段进行整体说明。
1.3 变量
作用:给一段指定的内存空间起名,方便操作这段内存。
变量必须初始化
语法:数据类型 变量名 = 变量初始值;
示例:
#include <iostream>
using namespace std;
int main ()
{//变量创建用法: 数据类型 变量名 = 变量初始值
int a = 10;
cout <<"a ="<< a << endl;
system ("pause");
return 0;
}
1.4 常量
作用:用于记录程序中不可更改的数据
C++定义常量有两种方式:
1.#define 宏常量: #define 常量名 常量值
通常在文件上方(即函数体 int main()上方)定义,表示一个常量
2.const修饰的变量: const 数据类型 常量名 = 常量值
通常在变量定义前加关键词const(一般写在函数体里面), 修饰该变量为常量,不可修改
示例:
# include <iostream>
using namespace std;
//1. #define 宏常量
# define Day 7
int main ()
{
//Day 14;//错误,Day 是常量,一旦修改就会报错
cout <<"一周总共有:"<< Day << "天" << endl;
//2. const修饰的变量
const int month = 12;
// month = 24;//错误,const修饰的变量也成为常量;
cout <<"一年总共有:"<< month << "个月份" << endl;
system ("pause");
return 0;
}
1.5 关键字
作用:关键字是C++中预先保留的单词(标识符)
在定义变量或者常量的时候,不要用关键字,否则会产生歧义。
C++关键字如下:
| asm | do | if | return | typedef |
| auto | double | inline | short | typeid |
| bool | dynamic_cast | int | signed | typename |
| break | else | long | sizeof | union |
| case | enum | mutable | static | unsigned |
| catch | explicit | namespace | static_cast | using |
| char | export | new | struct | virtual |
| class | extern | operator | switch | void |
| const | false | private | template | volatile |
| const_cast | float | protected | this | wchar_t |
| continue | for | public | throw | while |
| default | friend | register | true | |
| delete | goto | reinterpret_cast | try |
1.6 标识符命名规则
标识符不能是关键字
标识符只能由字母,数字,下划线组成
第一个字符必须是字母或下划线
标识符中字母区分大小写
建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人知晓。
示例:
# include <iostream>
using namespace std;
int main ()
{
//1.标识符不可是关键字
//int int = 10;
//2.标识符是由字母,数字,下划线构成
int abc = 10;
int _abc = 20;
int _123abc = 30;
//3.标识符第一个字符只能以字母或下划线开头
//int 123abc = 40;//错误,标识符不能以数字开头
//4.标识符区分大小写
int aaa = 10;
//cout << AAA << endl; //AAA与aaa不是同一个名称
// 建议:给变量起名时,最好做到见名知意
int num1 = 10;
int num2 = 20;
int sum = num1 + num2;
cout <<sum << endl;
system ("pause");
return 0;
}
C++规定在创建一个变量或常量时,必须要指定相应的数据类型,否则无法给变量分配内存。
2. 数据类型
2.1 整型
作用:整型变量表示的是整型类型的数据
c++中能够表示整型的数据有以下几种方式,区别在于所占内存空间不同。
| 数据类型 | 占用空间 | 取值范围 |
| short(短整型) | 2字节 | (-2^15 - 2^15-1) |
| int(整型) | 4字节 | (-2^31 - 2^31-1) |
| long(长整型) | Windows为4字节,Linux为4字节(32位),8字节(64位) | (-2^31 - 2^31-1) |
| long long(长长整型) | 8字节 | (-2^63 - 2^63-1) |
关系比较:short < int <= long <= long long
示例:
# include <iostream>
using namespace std;
int main ()
{
//1.短整型
short num1 = 10;
//2.整型
int num2 = 10;
//3.长整型
long num3 = 10;
//4.长长整型
long long num4 = 10;
cout <<"num1 = "<< num1 << endl;
cout <<"num2 = "<< num2 << endl;
cout <<"num3 = "<< num3 << endl;
cout <<"num4 = "<< num4 << endl;
system ("pause");
return 0;
}
2.2 sizeof关键字
作用:利用sizeof关键字可以统计数据类型所占内存的大小。
语法:sizeof (数据类型 / 变量)
示例:
# include <iostream>
using namespace std;
int main ()
{
short num1 = 10;
cout <<"short所占的内存空间为"<< sizeof (short) << endl;
int num2 = 10;
cout <<"int所占的内存空间为"<< sizeof (int) << endl;
long num3 = 10;
cout <<"long所占的内存空间为"<< sizeof (num3) << endl;
long long num4 = 10;
cout <<"long long 所占的内存空间为"<< sizeof (num4) << endl;
system ("pause");
return 0;
}
2.3 实型(浮点型)
作用:用于表示小数
浮点型变量分为两种:
1. 单精度 float
2. 双精度 double
两者区别在于表示的有效数字范围不同
| 数据类型 | 占用空间 | 有效数字范围 |
| float | 4字节 | 7位有效数字 |
| double | 8字节 | 15~16位有效数字 |
示例:
# include <iostream>
using namespace std;
int main ()
{
//默认情况下输出一个数字,会显示6位有效数字
float f1 = 3.1415926f; // 加f是为了表示的是float型;double型可以不加
double d1 = 3.1415926;
cout << "f1 =" << f1 << endl;
cout << "d1 =" << d1 << endl;
// 统计float 和 double 占用空间
cout << "float所占字节为 " << sizeof (float) << "字节" << endl;
cout << "double所占字节为 " << sizeof (double) << "字节" << endl;
//科学计数法
float f2 = 3e2; //3*10^2
cout << "f2 =" << f2 << endl;
float f3 = 3e-2; //3*10^(-2)
cout << "f3 =" << f3 << endl;
system ("pause");
return 0;
}
2.4 字符型
作用:用于显示单个字符
语法:char ch = ' a '
注意:
1. 在显示字符型变量时,用单引号将字符括起来,不要用双引号
2.单引号内只能有一个字符,不可以是字符串
C和C++中字符变量只占用1个字节
字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元
示例:
# include <iostream>
using namespace std;
int main ()
{
//1. 字符型变量的创建方式
char ch = 'a';
cout << ch << endl;
//2.字符型变量所占的内存大小
cout << "char字符型所占内存为" << sizeof (char) << "字节" << endl;
//3. 字符型变量常见错误
//char ch2 = "b";// 创建字符型变量时要用单引号
//char ch3 = 'adcc'; //创建字符型变量时单引号内只能有一个字符
//4.字符型变量对应的ASCII编码
/*常用的ASCII编码值:
A - 65
a - 97
*/
cout << (int)ch << endl;// (int)ch 是将字符型变量强制转换为整型变量
system ("pause");
return 0;
}
2.5 转义字符
作用:用于表示一些不能显示出来的ASCII字符
目前常用的有:
\n :换行,将当前位置移到下一行开头
\\: 代表一个反斜线字符“\”
\t: 水平制表(跳到下一个TAB位置)
示例:
# include <iostream>
using namespace std;
int main ()
{
// 转义字符
// 1.换行符 \n
cout << "hello world \n";
cout << "hello world" << endl; //9,10行表示的含义相同
// 2.反斜杠 \\
cout << "\\" << endl; // 第一个反斜杠\含义是告诉编译器要输出一个特殊符号,第二个反斜杠\含义是输出的符号是反斜杠\
// 3.水平制表符 \t 作用:可以整齐的输出数据
cout << "aaa\thelloworld" << endl;
cout << "aa\thelloworld" << endl;
cout << "aaaa\thelloworld" << endl;
system ("pause");
return 0;
}
2.6 字符串型
作用: 用于表示一串字符
两种表示方法:
1.C语言写法的字符串:char 变量名 [ ] = "字符串值"
示例:
int main ()
{
// 1.C风格字符串
//注意事项1 char 字符串名[]
//注意事项2 等号后面 要用双引号 包含起来字符串
char str[] = "hello world";
cout << str << endl;
2.C++写法字符串: string 变量名 = “字符串值”
# include <string> // 用C++风格字符串时,要包含这个头文件
示例:
# include <iostream>
using namespace std;
# include <string> // 用C++风格字符串时,要包含这个头文件
int main ()
{
//2.C++风格字符串
//注意事项 :包含一个头文件 # include <string>
string str2 = "hello world";
cout << str2 << endl;
system ("pause");
return 0;
}
2.7 布尔类型 bool
作用:布尔数据类型代表真或假的值
bool 类型只有两个值:
true - 真 (本质是1)
false - 假 (本质是0)
bool 类型占1个字节大小
示例:
# include <iostream>
using namespace std;
int main()
{
//1.创建bool类型数据
bool flag = true; // true 代表真
cout << flag << endl;
flag = false; // false 代表假
cout << false<< endl;
// 本质上1代表真,0代表假
// 2.查看bool类型所占内存空间
cout <<"bool类型所占内存空间" << sizeof (bool) << endl;
system ("pause");
return 0;
}
2.8 数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin >> 变量
示例:
# include <iostream>
using namespace std;
# include <string>
int main ()
{
//1.整型
int a = 0;
cout <<"请给整型变量a赋值:" << endl;
cin >> a;
cout <<"整型变量a = "<< a << endl;
//2. 浮点型
float f = 3.14f;
cout <<"请给浮点型变量f赋值:" << endl;
cin >> f;
cout <<"浮点型变量f值 = "<< f << endl;
//3.字符型
char ch = 'a';
cout << "请给字符型变量ch赋值:"<< endl;
cin >> ch;
cout << "字符型变量ch的值 = " << ch << endl;
//4.字符串型
string str = "hello";
cout << "请给字符串str赋值:"<< endl;
cin >> str;
cout << "字符串str值 = " << str << endl;
//5.布尔类型
bool flag = false;
cout << "请给布尔类型 flag 赋值:" << endl;
cin >> flag; // bool 类型 只要是非0的值都代表真;
cout << "布尔类型 flag = " << flag << endl;
system ("pause");
return 0;
}
3. 运算符
作用:执行代码的运算
3.1 算数运算符
作用:处理四则运算
算术运算符包括以下符号:
| 运算符 | 术语 | 示例 | 结果 |
| + | 正号 | +3 | 3 |
| - | 负号 | -3 | -3 |
| + | 加 | 10+5 | 15 |
| - | 减 | 10-5 | 5 |
| * | 乘 | 10*5 | 50 |
| / | 除 | 10/5 | 2 |
| % | 取余(取模) | 10%3 | 1 |
| ++ | 前置递增 | 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; |
示例:
1.加减乘除:
# include <iostream>
using namespace std;
int main ()
{
//加减乘除
int a1 = 10;
int b1 = 3;
cout << a1+b1 << endl;
cout << a1-b1 << endl;
cout << a1 * b1 << endl;
cout << a1 / b1 << endl; // 两个整数相除,结果依然是整数,将小数部分去除
int a2 = 10;
int b2 = 20;
cout << a2 / b2 << endl; //输出结果为0
/*
int a3 = 10;
int b3 = 0;
cout << a3 / b3 << endl; // 错误,两个数字相除,除数是不可以为0的
*/
//两个小数可以相除
double d1 = 0.5;
double d2 = 0.22;
cout << d1 / d2 << endl;// 运算的结果也可以是小数
double d3 = 0.5;
double d4 = 0.25;
cout << d3 / d4 << endl;
system ("pause");
return 0;
}
2. 取模(取余):
# include <iostream>
using namespace std;
int main()
{
//取模运算的本质就是取余
int a1 = 10;
int b1 = 3;
cout << a1 % b1 << endl;
int a2 = 10;
int b2 = 20;
cout << a2 % b2 << endl;
/*int a3 = 10;
int b3 = 0;
cout << a3 % b3 << endl;两个数相除除数不可以为0,所以也做不了取模运算
*/
//两个小数是不可以做取模运算的
/*double d1 = 3.14;
double d2 = 1.14;
cout << d1 % d2 << endl;
*/
system ("pause");
return 0;
}
3. 递增递减
# include <iostream>
using namespace std;
int main()
{
//1.前置递增
int a = 10;
++a; //让变量加1
cout << "a = " << a << endl;
//2.后置递增
int b = 10;
b++; //让变量加1
cout << "b = " << b << endl;
//3.前置和后置的区别
// 前置递增:先让变量+1,然后进行表达式计算
int a1 = 10;
int b1 = ++a1 * 10;
cout << "a1 = " << a1 << endl;
cout << "b1= " << b1 << endl;
// 后置递增:先进行表达式运算,后让变量+1
int a2 = 10;
int b2 = a2++ * 10;
cout << "a2 = " << a2 << endl;
cout << "b2= " << b2 << endl;
system ("pause");
return 0;
}
3.2 赋值运算符
作用:将表达式的值赋给变量
| 运算符 | 术语 | 示例 | 结果 |
| = | 赋值 | a = 2; b = 3; | a = 2; b = 3; |
| += | 加等于 | a = 0; a += 2; | a = 2; |
| -= | 减等于 | a = 5; a -= 3; | a = 2; |
| *= | 乘等于 | a = 2; a *= 2; | a = 4; |
| /= | 除等于 | a = 4; a /= 2; | a = 2; |
| %= | 模等于 | a = 3; a%=2; | a = 1; |
示例:
# include <iostream>
using namespace std;
int main()
{
//赋值运算符
// =
int a = 10;
a = 100;
cout << "a = " << a << endl;
// +=
a = 10;
a += 2; // a = a+2;
cout << "a = " << a << endl;
// -=
a = 10;
a -= 2;// a = a-2;
cout << "a = " << a << endl;
// *=
a = 10;
a *= 2; // a = a*2;
cout << "a = " << a << endl;
// /=
a = 10;
a /= 2; // a = a/2;
cout << "a = " << a << endl;
// %=
a = 10;
a %= 2; // a = a%2;
cout << "a = " << a << endl;
system ("pause");
return 0;
}
3.3 比较运算符
作用:用于表达式的比较,并返回一个真值或假值
| 运算符 | 术语 | 示例 | 结果 |
| == | 相等于 | 4 = = 2; | 0 |
| != | 不等于 | 4 != 3; | 1 |
| < | 小于 | 4 < 3 | 0 |
| > | 大于 | 4 > 3 | 1 |
| <= | 小于等于 | 4 <= 3 | 0 |
| >= | 大于等于 | 4 >= 1 | 1 |
示例:
# include <iostream>
using namespace std;
int main()
{
//比较运算符
// ==
int a = 10;
int b = 20;
cout << (a == b) << endl;
// !=
cout << (a != b) << endl;
// <
cout << (a < b) << endl;
// >
cout << (a > b) << endl;
// >=
cout << (a >= b) << endl;
// <=
cout << (a <=b) << endl;
system ("pause");
return 0;
}
3.4 逻辑运算符
作用:用于根据表达式的值返回真值或假值
C++中除了0都为真
| 运算符 | 术语 | 示例 | 结果 |
| ! | 非 | !a | 如果a为假,则a为真;如果a为真,则a为假; |
| && | 与 | a && b | 如果a和b都为真,则结果为真,否则为假 |
| | | | 或 | a | | b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假 |
示例:
1. 逻辑非: 真变假,假变真
2. 逻辑与:同真为真,其余为假
3. 逻辑或:同假为假,其余为真
# include <iostream>
using namespace std;
int main()
{
// 逻辑运算符 非 !
int a = 10;
cout << !a << endl;
//逻辑运算符 与 &&
int b = 20;
cout << (a && b) << endl;
int c = 0;
cout << (c && b) << endl;
// 逻辑运算符 或 ||
int d = 10;
int e = 0;
cout << (c || d) << endl;
cout << (a || d) << endl;
cout << (c || e) << endl;
system ("pause");
return 0;
}
4. 程序流程结构
C++支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构
顺序结构:程序按顺序执行,不发生跳转
选择结构:依据条件是否满足,有选择的执行相应功能
循环结构:依据条件是否满足,循环多次执行某段代码
4.1 选择结构
4.1.1 if语句
作用:执行满足条件的语句
if语句的三种形式:
单行格式if语句
多行格式if语句
多条件的if语句
1. 单行格式if语句: if (条件) { 条件满足执行的语句 }

示例:
# include <iostream>
using namespace std;
int main()
{
// 选择结构 单行if语句
//用户输入一个分数,如果分数大于600,视为考上一本大学,在屏幕上输出
// 1.用户输入分数
int score = 0;
cout << "请输入一个分数:" << endl;
cin >> score;
// 2.打印用户输入的分数
cout << "您输入的分数为:" << score << endl;
// 3.判断分数是否大于600,如果大于600,那么输出
// 注意事项:if条件后面不要加分号
if (score > 600)
{
cout << "恭喜您考上一本大学" << endl;
}
system ("pause");
return 0;
}
2. 多行格式if语句:if (条件) { 条件满足执行的语句 } else { 条件不满足执行的语句 }

示例:
# include <iostream>
using namespace std;
int main()
{
// 选择结构 多行if结构
// 输入考试分数,如果分数大于600,视为考上一本大学,在屏幕上输出;
//如果没考上大学,打印未考上一本大学;
// 1. 输入考试分数
int score = 0;
cout << "请输入您的考试分数:" << endl;
cin >> score;
// 2. 打印用户输入的分数
cout << "您输入的考试分数为:" << score << endl;
// 3. 判断分数是否大于600,如果大于600,那么输出考上一本,否则输出未考上一本
if (score > 600)
{
cout << "恭喜您考上一本" << endl;
}
else
{
cout << "您未考上一本" << endl;
}
system ("pause");
return 0;
}
3. 多条件的if语句:if (条件1) { 条件1满足执行的语句 } else if (条件2) { 条件2满足执行的语句 }...else (都不满足执行的语句)

示例:
# include <iostream>
using namespace std;
int main()
{
// 选择结构 多选择if语句
// 输入一个考试分数,如果大于600分,视为考上一本大学,在屏幕上输出
// 大于500,视为考上二本大学,屏幕输出
// 大于400,视为考上三本大学,屏幕输出
// 小于等于400分,视为未考上本科,屏幕输出
// 1. 用户输入分数
int score = 0;
cout << "请输入您的考试分数:" << endl;
cin >> score;
// 2.提示输入的分数
cout << "您输入的考试分数为:" << score << endl;
/* 3.判断
如果大于600,考上一本
如果大于500,考上二本
如果大于400,考上三本
前三个都没有满足,未考上本科*/
if (score > 600)
{
cout << "恭喜您考上一本" << endl;
}
else if (score > 500)
{
cout << "恭喜您考上二本" << endl;
}
else if (score > 400)
{
cout << "恭喜您考上三本" << endl;
}
else
{
cout << "未考上本科" << endl;
}
system ("pause");
return 0;
}
4. 嵌套if语句
在if语句中,可以嵌套使用if语句,达到更精确的条件判断
示例:
提示用户输入分数,然后根据分数做出如下判断:
分数如果大于600分视为考上一本,大于500分视为考上二本,大于400分视为考上三本,其余视为考上本科;
在一本分数中,如果大于700分,考入北大,大于650分,考入清华,大于600分考入人大
# include <iostream>
using namespace std;
int main()
{
/*
提示用户输入分数,然后根据分数做出如下判断:
分数如果大于600分视为考上一本,大于500分视为考上二本,大于400分视为考上三本,其余视为考上本科;
在一本分数中,如果大于700分,考入北大,大于650分,考入清华,大于600分考入人大
*/
// 1.提示输入分数
int score = 0;
cout << "请输入高考分数:" << endl;
cin >> score;
// 2.显示输入的分数
cout << "输入的高考分数为:" << score << endl;
// 3.判断
/* 如果大于600 一本
大于700 北大
大于650 清华
大于600 人大
如果大于500 二本
如果大于400 三本
其余情况 未考上本科
*/
if (score > 600)
{
cout << "恭喜您考上一本" << endl;
if ( score > 700)
{
cout << "您能考上北京大学" << endl;
}
else if ( score > 650 )
{
cout << "您能考上清华大学" << endl;
}
else
{
cout << "您能考上人民大学" << endl;
}
}
else if (score > 500)
{
cout << "恭喜您考上二本" << endl;
}
else if (score > 400)
{
cout << "恭喜您考上三本" << endl;
}
else
{
cout << "未考上本科" << endl;
}
system ("pause");
return 0;
}
练习案例: 三只小猪称体重
有三只小猪,ABC,请分别输出三只小猪的体重,并且判断哪只小猪更重?
# include <iostream>
using namespace std;
int main()
{
//有三只小猪,ABC,请分别输出三只小猪的体重,并且判断哪只小猪更重?
// 1.创建三只小猪体重
int num1 = 0;
int num2 = 0;
int num3 = 0;
//2.让用户输入三只小猪体重
cout << "请输入小猪A的体重" << endl;
cin >> num1;
cout << "请输入小猪B的体重" << endl;
cin >> num2;
cout << "请输入小猪C的体重" << endl;
cin >> num3;
//3.判断哪只最重
// 先判断A和B的重量
if ( num1 > num2) // A比B重
{
if( num1 > num3) //A比C重
{
cout << "小猪A最重" << endl;
}
else // C比A重
{
cout << "小猪C最重" << endl;
}
}
else // B比A重
{
if( num2 > num3) //B比C重
{
cout << "小猪B最重" << endl;
}
else // C比B重
{
cout << "小猪C最重" << endl;
}
}
cout << "小猪A的体重为" << num1 << endl;
cout << "小猪B的体重为" << num2 << endl;
cout << "小猪C的体重为" << num3 << endl;
system ("pause");
return 0;
}
4.1.2 三目运算符
作用: 通过三目运算符实现简单的判断
语法: 表达式1 ? 表达式2 : 表达式3
解释:
如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
如果表达式1的值为真,执行表达式3,并返回表达式3的结果;
示例:
# include <iostream>
using namespace std;
int main()
{
// 三目运算符
// 创建三个变量 a b c
// 将a和b做比较,将变量大的值赋值给变量c
int a = 10;
int b = 20;
int c = 0;
c = (a > b ? a :b);
cout << "c = " << c << endl;
// 在C++中三目运算符返回的是变量,可以继续赋值
(a > b ? a :b) = 100;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system ("pause");
return 0;
}
4.1.3 switch语句
作用:执行多条件分支语句
语法:switch ( 表达式 )
{
case 结果1: 执行语句;break;
case 结果2: 执行语句;break;
.......
default: 执行语句;break;
}
示例:
# include <iostream>
using namespace std;
int main()
{
//switch语句
/*
给电影打分:
10-9分 经典
8-7分 非常好
6-5分 一般
5分以下 烂片
*/
//1.提示用户给电影打分
cout << "请给电影进行打分" << endl;
//2.用户开始给电影打分
int score = 0;
cin >> score;
cout << "您给电影打的分数为" << score << endl;
//3.根据用户输入的分数来提示用户最后的结果
switch ( score )
{
case 10:
cout << "您认为是经典电影" << endl;
break; // 退出当前分支
case 9:
cout << "您认为是经典电影" << endl;
break;
case 8:
cout << "您认为电影非常好" << endl;
break;
case 7:
cout << "您认为电影非常好" << endl;
break;
case 6:
cout << "您认为电影一般" << endl;
break;
case 5:
cout << "您认为电影一般" << endl;
break;
default:
cout << "您认为电影是一个烂片" << endl;
}
system ("pause");
return 0;
}
if 和 switch 区别:
switch 缺点:判断时候只能是整型或者字符型,不可以是一个区间
switch优点:结构清晰,执行效率高
if 判断时可以是一个区间
case 里如果没有break,那么程序会一直向下进行
4.2 循环结构
4.2.1 while 循环语句
作用:满足循环条件,执行循环语句
语法:while (循环条件) { 循环语句 }
解释:只要循环条件的结果为真,就执行循环语句

示例:
# include <iostream>
using namespace std;
int main()
{
//while 循环
// 在屏幕中打印0-9这10个数字
int num = 0;
while ( num <10 )
{
cout << num << endl;
num++;
}
system ("pause");
return 0;
}
注意:在执行循环语句的时候,程序必须提供跳出循环的出口,否则出现死循环。
while 循环练习案例:
系统随机生成一个1到100之间的数字,玩家进行猜测,如果猜错,提示玩家数字过大或过小,如果猜对恭喜玩家胜利,并且退出游戏。
# include <iostream>
using namespace std;
// time系统时间头文件包含
# include <ctime>
int main()
{ // 添加随机数种子,作用:利用当前系统时间生成随机数,防止每次随机数都一样
srand ((unsigned int)time (NULL));
//1. 系统生成一个随机数
//rand ()%100 // rand ()%100 生成0 ~ 99随机数
int num = rand ()% 100 + 1; // rand ()%100 生成0 +1~ 99+1随机数
//cout << num << endl;
//2. 玩家进行猜测
int val = 0; // 玩家输入的数据
while (1)
{
cin >> val;
//3.判断玩家的猜测
// 猜错 提示猜的结果,过大或过小 ,重新返回第2步
if (val > num)
{
cout << "猜测过大" << endl;
}
else if( val < num)
{
cout << "猜测过小" << endl;
}
else
{
cout << "猜测正确" << endl; // 猜对 退出游戏
break; //break在循环中,可以利用该关键字退出当前循环
}
}
system ("pause");
return 0;
}
// 添加随机数种子,作用:利用当前系统时间生成随机数,防止每次随机数都一样
srand ((unsigned int)time (NULL));
// time系统时间头文件包含
# include <ctime>
//rand ()%100 // rand ()%100 生成0 ~ 99随机数
int num = rand ()% 100 + 1; // rand ()%100 生成0 +1~ 99+1随机数
4.2.2 do...while 循环语句
作用:满足循环条件,执行循环语句
语法:do { 循环语句 } while ( 循环条件 );
注意:与while的区别在于do...while 会执行一次循环语句,再判断循环条件

示例:
# include <iostream>
using namespace std;
int main()
{
// do...while 语句
//在屏幕上输出0-9这10个数字
int num = 0;
do
{
cout << num << endl;
num++;
}
while (num < 10);
//与while的区别在于do...while 会执行一次循环语句,再判断循环条件
system ("pause");
return 0;
}
练习案例:水仙花数
水仙花数是指一个3位数,它的每一位上的数字的3次幂之和等于它本身
例如:1^3+5^3+3^3 = 153
请用do ... while 语句,求出所有3位数中的水仙花数
# include <iostream>
using namespace std;
int main()
{
// 1.先打印所有的三位数字
int num = 100;
do
{
// 2.从所有的三位数字中找到水仙花数
int a = 0; //个位
int b = 0;//十位
int c = 0;//百位
a = num % 10; //获取数字的个位
b = num / 10 % 10;//获取数字的十位
c = num / 100;//获取数字的百位
if (a*a*a+b*b*b+c*c*c == num) // 如果是水仙花数,打印出来
{
cout << num << endl;
}
num++;
}
while ( num < 1000);
system ("pause");
return 0;
}
4.2.3 for循环语句
作用:满足循环条件,执行循环语句
语法:for (起始表达式;条件表达式;末尾循环体) { 循环语句 }
示例:
# include <iostream>
using namespace std;
int main()
{
// for循环
//从数字0打印到数字9
for (int i = 0;i < 10; i++)
{
cout << i << endl;
}
system ("pause");
return 0;
}
练习案例:敲桌子
案例描述:从1开始数到数字100,如果数字个位含有7,或者数字十位含有7,或者该数字是7的倍数,我们打印敲桌子,其余数字直接打印输出。
# include <iostream>
using namespace std;
int main()
{
//敲桌子案例
//1. 先输出1-100数字
for (int num = 1; num <101; num++)
{
//2. 从100个数字中找到特殊字符,打印“敲桌子”
//如果是7的倍数 或者个位,十位有7,打印“敲桌子”
if (num % 7 == 0 || num % 10 == 7 || num / 10 == 7) //如果是特殊字符,打印“敲桌子”
{
cout << "敲桌子" << endl;
}
else
{
cout << num << endl;
}
}
system ("pause");
return 0;
}
4.2.4 嵌套循环
作用: 在循环体中在嵌套一层循环,解决一些实际问题
示例 :
# include <iostream>
using namespace std;
int main()
{
//利用嵌套循环实现星图
// 打印一行星图
//外层执行一次,内层执行一周
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
cout << "* " ;
}
cout << endl;
}
system ("pause");
return 0;
}
输出结果:

练习案例:乘法口诀表
案例描述:利用嵌套循环,实现九九乘法口诀表
# include <iostream>
using namespace std;
int main()
{
//乘法口诀表
//打印行数
for (int i = 1; i < 10; i++)
{
//cout << i << endl;
for (int j = 1; j <= i; j++ )
{
cout << j << "*" << i << "=" << j*i << " ";
}
cout << endl;
}
system ("pause");
return 0;
}
4.3 跳转语句
4.3.1 break语句
作用:用于跳出选择结构或者循环结构
break使用的时机:
出现在switch条件语句中,作用是终止case并跳出switch
出现在循环语句中,作用是跳出当前的循环语句
出现在嵌套循环中,跳出最近的内层循环语句
示例 :
# include <iostream>
using namespace std;
int main()
{
//break的使用时机
//1.出现在switch语句中
cout << "请选择副本难度" << endl;
cout << "1. 普通" << endl;
cout << "2. 中等" << endl;
cout << "3. 困难" << endl;
int select = 0; // 创建变量选择的结果
cin >> select; //等待用户的输入
switch (select)
{
case 1:
cout << "您选择的是普通难度" << endl;
break;
case 2:
cout << "您选择的是中等难度" << endl;
break; // 退出switch语句
case 3:
cout << "您选择的是困难难度" << endl;
break;
default:
break;
}
//2.出现在循环语句中
for (int i = 0; i < 10; i++)
{
// 如果i等于5,退出循环,不再打印
if (i == 5)
{
break; // 退出循环
}
cout << i << endl;
}
//3.出现在嵌套循环语句中
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (j == 5)
{
break; //退出内层循环
}
cout << "* " ;
}
cout << endl;
}
system ("pause");
return 0;
}
4.3.2 continue语句
作用:再循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环
示例:
# include <iostream>
using namespace std;
int main()
{
// continue语句
for (int i = 0; i <= 100; i++)
{
// 如果是奇数就输出,偶数不输出
if (i % 2 == 0)
{
continue;
}
cout << i << endl;
}
system ("pause");
return 0;
}
4.3.3 goto语句
作用:可以无条件跳转语句
语法:goto 标记;
解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置,然后接着程序顺序继续执行。
示例:
# include <iostream>
using namespace std;
int main()
{
// goto语句
cout << "1.xxx" << endl;
cout << "2.xxx" << endl;
goto FLAG;
cout << "3.xxx" << endl;
cout << "4.xxx" << endl;
FLAG:
cout << "5.xxx" << endl;
system ("pause");
return 0;
}
5. 数组
5.1 概述
数组,就是一个集合,里面存放了相同类型的数据元素
特点:
1.数组中的每个数据元素都是相同的数据类型
2.数组是由连续的内存位置组成的
5.2 一维数组
5.2.1 一维数组定义方式
三种定义方式:
1. 数据类型 数组名 [ 数组长度 ];
2. 数据类型 数组名 [ 数组长度 ] = { 值1,值2,...};
3. 数据类型 数组名 [ ] = { 值1,值2,...};
注意:
数组元素的下标是从0开始索引的
如果在初始化数据的时候,没有全部填写完,会用0来填补剩余数据
定义数组的时候,必须有初始长度
示例:
# include <iostream>
using namespace std;
int main()
{
// 数组
/*三种定义方式:
1. 数据类型 数组名 [ 数组长度 ];
2. 数据类型 数组名 [ 数组长度 ] = { 值1,值2,...};
3. 数据类型 数组名 [ ] = { 值1,值2,...};
*/
// 1. 数据类型 数组名 [ 数组长度 ];
int arr1 [5];
// 给数组中的元素进行赋值
// 数组元素的下标是从0开始索引的
arr1 [0] = 10;
arr1 [1] = 20;
arr1 [2] = 30;
arr1 [3] = 40;
arr1 [4] = 50;
// 访问数据元素
cout << arr1 [0] << endl;
cout << arr1 [1] << endl;
cout << arr1 [2] << endl;
cout << arr1 [3] << endl;
cout << arr1 [4] << endl;
// 2. 数据类型 数组名 [ 数组长度 ] = { 值1,值2,...};
// 如果在初始化数据的时候,没有全部填写完,会用0来填补剩余数据
int arr2 [5] = {10, 20, 30, 40, 50};
/*cout << arr2 [0] << endl;
cout << arr2 [1] << endl;
cout << arr2 [2] << endl;
cout << arr2 [3] << endl;
cout << arr2 [4] << endl;
*/
// 利用循环输出数组中的元素
for (int i = 0; i < 5; i++)
{
cout << arr2 [i] << endl;
}
//3. 数据类型 数组名 [ ] = { 值1,值2,...};
// 定义数组的时候,必须有初始长度
int arr3 [] = { 90, 80, 70, 60, 50, 40, 30, 20, 10};
for (int i = 0; i < 9; i++)
{
cout << arr3 [i] << endl;
}
system ("pause");
return 0;
}
5.2.2 一维数组数组名
一维数组名称的用途:
1.可以统计整个数组在内存中的长度
例:int arr [5] = {1, 2, 3, 4, 5};
sizeof ( arr );
统计数组中单个元素在内存中的长度
如:sizeof ( arr[ 0 ] );
2.可以获取数组在内存中的首地址
如:cout << arr << endl;
示例:
# include <iostream>
using namespace std;
int main()
{
// 一维数组名称的用途:
// 1.可以统计整个数组在内存中的长度
int arr [10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << "整个数组占用的内存空间为:" << sizeof (arr) << endl;
cout << "每个元素占用的内存空间为:" << sizeof (arr[0]) << endl;
cout << "数组中元素个数为:" << sizeof (arr) / sizeof (arr[0]) << endl;
//2.可以获取数组在内存中的首地址
cout << "数组的首地址为:" << arr << endl;
// 将数组的首地址强制转换为十进制显示
cout << "数组的首地址为:" <<(int)arr << endl;
cout << "数组中第一个元素的地址为:" << &arr[0] << endl;
cout << "数组中第二个元素的地址为:" << &arr[1] << endl;
// 数组名是常量,不可以进行赋值操作
system ("pause");
return 0;
}
注意:数组名是常量,不可以进行赋值操作
练习案例1:五只小猪称体重
案例描述:
在一个数组中记录了五只小猪的体重,如:int arr [5] = { 300, 350, 200, 400, 250};
找出并打印最重的小猪体重。
# include <iostream>
using namespace std;
int main()
{
//1.创建5只小猪体重
int arr[5] = { 300, 350, 200, 400, 250};
//2.从数组中找到最大值
int max = 0; //先认定一个最大值为0
for (int i = 0; i < 5; i++)
{
//cout << arr[i] << endl;
// 如果访问的数组中的元素比我认定的最大值还要大,更新最大值
if (arr[i] > max)
{
max = arr[i];
}
}
//3.打印最大值
cout << "最重的小猪体重为:" << max << endl;
system ("pause");
return 0;
}
练习案例2:数组元素逆置
案例描述:请声明一个5个元素的数组,并且将元素逆置
如果原数组元素为:1,3,2,5,4.逆置后输出结果为:4,5,2,3,1
# include <iostream>
using namespace std;
int main()
{
// 实现数组逆置
//1.创建数组
int arr[5] = { 1,3,2,5,4 };
cout << "数组逆置前结果:" << endl;
for (int i = 0; i < 5; i++)
{
cout << arr[i] << endl;
}
//2. 实现逆置
//2.1记录起始下标位置
//2.2记录结束下标位置
//2.3起始下标与结束下标的元素互换
//2.4起始位置++ ,结束位置--
//2.5循环执行2.1操作,直到起始位置 >= 结束位置
int start = 0; //起始下标
int end = sizeof (arr) / sizeof (arr[0]) - 1;//结束下标
while (start < end)
{
//实现元素互换
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
//下标更新
start++;
end--;
}
// 打印逆置后的数组
cout << "数组逆置后结果:" << endl;
for (int i = 0; i < 5; i++)
{
cout << arr[i] << endl;
}
system ("pause");
return 0;
}
5.2.3 冒泡排序
作用:最常用的排序算法,对数组内元素进行排序
步骤:
1. 比较相邻的元素,如果第一个比第二个大,就交换他们两个
2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值
3. 重复以上步骤,每次比较次数减1,直到不需要比较
示例: 将数组{ 4,2,8,0,5,7,1,3,9}进行升序排序
分析:

#include <iostream>
using namespace std;
int main()
{
//利用冒泡排序实现升序序列
int arr [] = { 4,2,8,0,5,7,1,3,9};
cout << "排序前:" << endl;
for (int i = 0; i < 9; i++)
{
cout << arr [i] << " " ;
}
cout << endl;
//开始冒泡排序
// 总共排序轮数为:元素个数 - 1
for (int i = 0; i < 9 - 1; i++)
{
//内层循环对比次数=元素个数-当前轮数-1
for (int j = 0; j < 9 - i - 1; j++)
{
//如果第一个数字比第二个数字大,交换两个数字
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//排序后结果
cout << "排序后:" << endl;
for (int i = 0; i < 9; i++)
{
cout << arr [i] << " ";
}
system ("pause");
return 0;
}
5.3 二维数组
二维数组就是在一维数组上,多加一个维度
5.3.1 二维数组定义方式
二维数组定义的四种方式:
1. 数据类型 数组名 [ 行数 ] [ 列数 ];
2. 数据类型 数组名 [ 行数 ] [ 列数 ] = { {数据1,数据2},{数据3,数据4} };
3. 数据类型 数组名 [ 行数 ] [ 列数 ] = { 数据1,数据2,数据3,数据4 };
4. 数据类型 数组名 [ ] [ 列数 ] = { 数据1,数据2,数据3,数据4 };
建议:利用第二种定义方式,更加直观,提高代码的可读性
示例:
#include <iostream>
using namespace std;
int main()
{
/*二维数组定义的四种方式:
1. 数据类型 数组名 [ 行数 ] [ 列数 ];
2. 数据类型 数组名 [ 行数 ] [ 列数 ] = { {数据1,数据2},{数据3,数据4} };
3. 数据类型 数组名 [ 行数 ] [ 列数 ] = { 数据1,数据2,数据3,数据4 };
4. 数据类型 数组名 [ ] [ 列数 ] = { 数据1,数据2,数据3,数据4 };
*/
//1. 数据类型 数组名 [ 行数 ] [ 列数 ];
int arr [2][3];
arr[0][0] = 1;
arr[0][1] = 2;
arr[0][2] = 3;
arr[1][0] = 4;
arr[1][1] = 5;
arr[1][2] = 6;
/*
cout << arr[0][0] << endl;
cout << arr[0][1] << endl;
cout << arr[0][2] << endl;
cout << arr[1][0] << endl;
cout << arr[1][1] << endl;
cout << arr[1][2] << endl;
*/
//外层循环打印行数,内层行数打印列数
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr[i][j] << endl;
}
}
//2. 数据类型 数组名 [ 行数 ] [ 列数 ] = { {数据1,数据2},{数据3,数据4} };
int arr1 [2][3] =
{
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr1[i][j] << " " ;
}
cout << endl;
}
//3. 数据类型 数组名 [ 行数 ] [ 列数 ] = { 数据1,数据2,数据3,数据4 };
int arr2 [2][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr2[i][j] << " " ;
}
cout << endl;
}
//4. 数据类型 数组名 [ ] [ 列数 ] = { 数据1,数据2,数据3,数据4 };
int arr3[][3] = { 1,2,3,4,5,6};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr3[i][j] << " " ;
}
cout << endl;
}
system ("pause");
return 0;
}
5.3.2 二维数组数组名
查看二维数组所占内存空间
获取二维数组首地址
示例:
#include <iostream>
using namespace std;
int main()
{
/*二维数组数组名用途:
1. 查看二维数组所占内存空间
2.获取二维数组首地址
*/
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
//1. 查看二维数组所占内存空间
cout << "二维数组所占内存空间为:" << sizeof (arr) << endl;
cout << "二维数组第一行占内存空间为:" << sizeof (arr[0]) << endl;
cout << "二维数组第一个元素占内存空间为:" << sizeof (arr[0][0]) << endl;
cout << "二维数组行数为:" << sizeof (arr) / sizeof (arr[0]) << endl;
cout << "二维数组列数为:" << sizeof (arr[0]) / sizeof (arr[0][0]) << endl;
//2.获取二维数组首地址
cout << "二维数组的首地址为:" << arr << endl;//结果为16进制
//转换为十进制
cout << "二维数组的首地址为:" << (int)arr << endl;
cout << "二维数组第一行的首地址为:" << (int)arr[0] << endl;
cout << "二维数组第二行的首地址为:" << (int)arr[1] << endl;
cout << "二维数组第一个元素的首地址为:" << (int)&arr[0][0] << endl;
cout << "二维数组第二个元素的首地址为:" << (int)&arr[0][1] << endl;
//查看具体元素的地址要加取地址符&
system ("pause");
return 0;
}
5.3.3 二维数组应用案例
考试成绩统计:
案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
| 姓名 | 语文 | 数学 | 英语 |
| 张三 | 100 | 100 | 100 |
| 李四 | 90 | 50 | 100 |
| 王五 | 60 | 70 | 80 |
#include <iostream>
using namespace std;
#include <string>
int main()
{
//二维数组案例:考试成绩统计
//1. 创建二维数组
int scores[3][3] =
{
{100,100,100},
{90,50,100},
{60,70,80}
};
string names[3] = {"张三", "李四", "王五"};
//2. 统计每个人的总和分数
for (int i = 0; i < 3; i++)
{
int sum = 0; //统计分数总和变量
for (int j = 0; j < 3; j++)
{
sum += scores[i][j];
//cout << scores[i][j] << " ";
}
cout << names[i] << "的总分为:" << sum << endl;
}
system ("pause");
return 0;
}
6. 函数
6.1 概论
作用:将一段经常使用的代码封装起来,减少重复代码
一个较大的程序,一般分为若干个程序块,每个模块实现特定的功效。
6.2 函数的定义
函数的定义一般主要有5个步骤:
1. 返回值类型
2. 函数名
3. 参数列表
4. 函数体语句
5. return 表达式
语法:
返回值类型 函数名 (参数列表)
{
函数体语句
return 表达式
}
返回值类型:一个函数可以返回一个值,在函数定义中
函数名:给函数起个名称
参数列表:使用该函数时,传入的数据
函数体语句:花括号内的代码,函数内需要执行的语句
return表达式:和返回类型挂钩,函数体执行完毕后,返回相应的数据
示例:定义一个加法函数,实现两个数相加
int add (int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
6.3 函数的调用
功能:使用定义好的函数
语法:函数名 (参数)
示例:
#include <iostream>
using namespace std;
// 定义加法函数:实现两个整型相加,并且将相加的结果进行返回
// 函数定义的时候,num1和num2并没有真实数据,它只是一个形式上的参数,简称形参
int add (int num1, int num2)
{
int sum = num1 + num2;
return sum;
}
int main()
{
//main函数中调用add函数
int a = 10;
int b = 20;
//函数调用语法:函数名称 (参数)
//a和b称为实际参数,简称实参;
//当调用函数时,实参的值会传递给形参
int c = add (a,b);
cout << "c = " << c << endl;
a = 100;
b = 200;
c = add(a,b);
cout << "c = " << c << endl;
system ("pause");
return 0;
}
6.4 值传递
值传递就是:函数调用时实参将数值传入形参
值传递时,如果形参发生任何改变,并不会影响实参
不需要返回值的时候可以不写return
示例:
#include <iostream>
using namespace std;
//值传递
//定义函数:实现两个数字进行交换
//如果函数不需要返回值,声明的时候可以写void
void swap (int num1, int num2)
{
cout << "交换前:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
//return ; 不需要返回值的时候可以不写return
}
int main()
{
int a = 10;
int b = 20;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//当我们做值传递时,函数的形参发生改变,并不会影响实参
swap (a,b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system ("pause");
return 0;
}
6.5 函数的常见样式
常见的函数样式有4种
1. 无参无返
2. 有参无返
3. 无参有返
4.有参有返
示例:
#include <iostream>
using namespace std;
//常见的函数样式有4种
//1. 无参无返
void test01 ()
{
cout << "this is test01 " << endl;
}
//2. 有参无返
void test02 (int a)
{
cout << "this is test02 a = " << a << endl;
}
//3. 无参有返
int test03 ()
{
cout << "this is test03 " << endl;
return 1000;
}
//4.有参有返
int test04 (int a)
{
cout << "this is test04 a = " << a << endl;
return a;
}
int main()
{
//无参无返函数调用
test01 ();
//有参无返函数调用
test02 (100);
//无参有返函数调用
int num1 = test03();
cout << "num1 = " << num1 << endl;
//有参有返函数调用
int num2 = test04(10000);
cout << "num2 = " << num2 << endl;
system ("pause");
return 0;
}
6.6 函数的声明
作用:告诉编译器函数名称以及如何调用函数。函数的实际主体可以单独定义
函数的声明可以多次,但是函数的定义只能有一次
示例:
#include <iostream>
using namespace std;
//函数的声明
//比较函数,实现两个整型数字进行比较,返回较大的值
//提前告诉编译器函数的存在,可以利用函数的声明
//声明可以有多次,但是定义只能一次
//函数的声明:
int max (int a, int b);
int main()
{
int a = 10;
int b = 20;
cout << max (a,b) << endl;
system ("pause");
return 0;
}
int max (int a, int b)
{
return a > b ? a : b;
}
6.7 函数的分文件编写
作用:让代码结构更加清晰
函数的分文件编写一般有4个步骤:
1. 创建后缀名为.h的头文件
2. 创建后缀名为.cpp的源文件
3. 在头文件中写函数的声明
4. 在源文件中写函数的定义
示例:


主程序:
#include <iostream>
using namespace std;
#include "swap.h"
//函数的分文件
//实现两个数字进行交换的函数
//函数的声明:
//void swap (int a, int b);
//函数的定义:
/*void swap (int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}*/
//函数的分文件编写步骤:
/*1. 创建后缀名为.h的头文件
2. 创建后缀名为.cpp的源文件
3. 在头文件中写函数的声明
4. 在源文件中写函数的定义*/
int main()
{
int a = 10;
int b = 20;
swap (a, b);
system ("pause");
return 0;
}
7 指针
7.1 指针的基本概念
指针的作用:可以通过指针间接访问内存
内存编号是从0开始记录的,一般用十六进制数字表示
可以利用指针变量保存地址
7.2 指针变量的定义和使用
指针定义的语法: 数据类型 * 指针变量名;
示例:
# include <iostream>
using namespace std;
int main()
{
int a = 10;//定义一个整型变量a
// 1.定义一个指针
// 指针定义的语法: 数据类型 * 指针变量名;
int * p;
//指针变量赋值
p = &a;//让指针记录变量a的地址 ,&为取地址符
cout << "a的地址为:" << &a << endl;//打印数据a的地址
cout << "指针P = " << p << endl;// 打印指针变量p
// 2.使用指针
//可以通过解引用的方式来找到指针指向的内存
//指针前加 * 代表解引用,找到指针指向的内存中的数据
//通过 * 操作指针变量指向内存
//通过指针可以获取内存中保存的数值
//*p = 1000;//通过指针也可以修改内存中保存的数值
cout << "a = " << a << endl;
cout << "*p = " << *p << endl;
system ("pause");
return 0;
}
7.3 指针所占内存空间
提问:指针也是一种数据类型,那么这种数据类型占用多少内存空间?
在32位操作系统下 ,指针都占4个内存空间大小,不管是什么数据类型
在64位操作系统下 ,指针都占8个内存空间大小,不管是什么数据类型
示例:
#include <iostream>
using namespace std;
int main()
{
//指针所占内存空间
int a = 10;
//int * p;
//p = &a;
int * p = &a; //该行等价于8,9行
cout << "sizeof(int *) = " << sizeof(int *) << endl;
cout << "sizeof(float *) = " << sizeof(float *) << endl;
cout << "sizeof(double *) = " << sizeof(double *) << endl;
cout << "sizeof(char *) = " << sizeof(char *) << endl;
system ("pause");
return 0;
}
7.4 空指针和野指针
空指针:指针变量指向内存中编号为0的空间
用途: 初始化指针变量
注意: 空指针指向的内存是不可访问的
示例1:空指针
#include <iostream>
using namespace std;
int main()
{
//空指针
//1.空指针用于给指针变量进行初始化
int * p = NULL;
//2.空指针是不可以进行访问的
//0~255之间的内存编号为系统占用内存,不允许用户访问
* p = 100;
cout << * p << endl;
system ("pause");
return 0;
}
野指针:指针变量指向非法的内存空间
示例2:野指针
#include <iostream>
using namespace std;
int main()
{
//野指针
//程序中尽量避免出现野指针
int * p = (int *)0x1100;
cout << * p << endl;
system ("pause");
return 0;
}
总结:空指针和野指针都不是我们申请的空间,因此不要访问。
7.5 const修饰指针
const修饰指针有三种情况:
1. const修饰指针--------常量指针
eg: int a = 10;
int b = 20;
int * p = &a;
const int * p = &a;
特点:指针的指向可以修改,但是指针指向的值不可以修改
* p = 20;错误,指针指向的值不可以修改
p = &b; 正确,指针指向可以改
2. const修饰常量---------指针常量
int * const p = &a;
特点:指针的指向不可以修改,但是指针指向的值可以修改
* p = 20;正确,指针指向的值可以修改
p = &b; 错误,指针指向不可以改
3. const既修饰指针,又修饰常量
const int * const p = &a;
特点:指针的指向和指向的值都不可以修改
示例:
#include <iostream>
using namespace std;
int main()
{
//1. const修饰指针--------常量指针
int a = 10;
int b = 20;
const int * p = &a;
cout << p << endl;
cout <<* p << endl;
cout << &a << endl;
cout << &b << endl;
//*p =20; 错误,指针指向的值不可以修改
p = &b; //正确,指针指向可以改
//2. const修饰常量---------指针常量
int * const p2 = &a;
*p2 = 20; //正确,指针指向的值可以修改
// p2 = &b;错误,指针指向不可以改
//3. const既修饰指针,又修饰常量
const int * const p3 = &a;
//* p3 = 20; //错误,指针指向的值不可以修改
//p3 = &b; //错误,指针指向不可以改
system ("pause");
return 0;
}
7.6 指针和数组
作用:利用指针访问数组中的元素
示例:
#include <iostream>
using namespace std;
int main()
{
//指针和数组
//作用:利用指针访问数组中的元素
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int * p = arr;//数组名是数组的首地址
cout <<"利用指针访问第一个元素:" << * p << endl;
p++;// 让指针向后偏移4个字节
cout <<"利用指针访问第二个元素:" << * p << endl;
cout << "利用指针遍历数组" << endl;
int * p2 = arr;
for (int i = 0; i < 10; i++)
{
// cout << arr[i] << endl; 常规做法输出数组
//用指针访问数组
cout << *p2 << endl;
p2++;
}
system ("pause");
return 0;
}
7.7 指针和函数
作用:利用指针作函数参数,可以修改实参的值
示例:
#include <iostream>
using namespace std;
//实现两个数字进行交换
void swap01 (int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
}
void swap02 (int *p1,int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
//指针和函数
//1.值传递,不会改变实参
int a = 10;
int b = 20;
swap01 (a,b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//2. 地址传递,会改变实参
//如果是地址传递,可以修饰实参
swap02 (&a, &b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system ("pause");
return 0;
}
7.8 指针,数组,函数
案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序
例如数组:int arr[10] = {4,3,6,9,1,2,10,8,7,5};
示例:
#include <iostream>
using namespace std;
//冒泡排序函数 参数1:数组的首地址;参数2:数组长度
void bubbleSort (int * arr, int len)
{
for (int i = 0; i < len - 1;i++)
{
for (int j = 0; j < len - i - 1;j++)
{
//如果j>j+1的值,交换这两个数字
if (arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//打印数组
void printArray(int * arr,int len)
{
for (int i = 0;i < len; i++)
{
cout << arr[i] << endl;
}
}
int main()
{
//1.先创建数组
int arr[10] = {4,3,6,9,1,2,10,8,7,5};
int len = sizeof (arr) / sizeof (arr[0]); //数组长度
//2.创建函数,实现冒泡排序
bubbleSort(arr,len);
//3.打印排序后的数组
printArray (arr, len);
system ("pause");
return 0;
}
8 结构体
8.1 结构体基本概念
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
8.2 结构体定义和使用:
语法:struct 结构体名 { 结构体成员列表};
通过结构体创建变量的方式有三种:
struct 结构体名 变量名;
struct 结构体名 变量名 = { 成员1值,成员2值......};
定义结构体时顺便创建变量
示例:
#include <iostream>
#include <string>
using namespace std;
//1.创建学生数据类型 : 学生包括(姓名,年龄,分数)
//自定义数据类型:一些类型集合组成的一个类型
//语法:struct 类型名称 { 成员列表 }
struct student
{
//成员列表
//姓名
string name;
//年龄
int age;
//分数
int score;
}s3;
//2.通过学生类型创建具体学生
/*通过结构体创建变量的方式有三种:
2.1 struct 结构体名 变量名
struct student s1
2.2 struct 结构体名 变量名 = { 成员1值,成员2值......}
struct student s2 = { . . . .}
2.3 定义结构体时顺便创建变量
*/
int main()
{
//2.1 struct student s1
//结构体创建变量时struct关键字在C++中可以省略,在定义时不可省略
struct student s1;
//student s1; 与33行等价
//给s1属性赋值,通过 . 访问结构体变量中的属性
s1.name = "张三";
s1.age = 18;
s1.score = 100;
cout << "姓名:" << s1.name << " 年龄:" << s1.age << " 分数:" << s1.score << endl;
//2.2 struct student s2 = { . . . .}
struct student s2 = {"李四",19,90};
cout << "姓名:" << s2.name << " 年龄:" << s2.age << " 分数:" << s2.score << endl;
// 2.3 定义结构体时顺便创建变量
s3.name = "王五";
s3.age = 20;
s3.score = 80;
cout << "姓名:" << s3.name << " 年龄:" << s3.age << " 分数:" << s3.score << endl;
system ("pause");
return 0;
}
注:
1. 定义结构体时的关键字是struct,不可省略
2. 创建结构体变量时,关键字struct可省略
3. 结构体变量利用操作符“ . ”访问成员
8.3 结构体数组
作用:将自定义的结构体放入到数组中方便维护
语法:struct 结构体名 数组名[ 元素个数 ] = { { },{ },.... { } }
示例:
#include <iostream>
#include <string>
using namespace std;
//结构体数组
//1.定义结构体
struct student
{
//姓名
string name;
//年龄
int age;
//分数
int score;
};
int main()
{
//2.创建结构体数组
struct student stuArry[3] =
{
{"张三", 18, 100},
{"李四", 28, 90},
{"王五", 38, 80} //直接赋值,或者也可通过3中的方式赋值
};
//3.结构体数组中的元素赋值
stuArry[2].name = "赵六";
stuArry[2].age = 80;
stuArry[2].score = 100;
//4.遍历结构体数组
for(int i = 0; i < 3; i++)
{
cout << "姓名:" << stuArry[i].name << " 年龄:" << stuArry[i].age << " 分数:" <<stuArry[i].score << endl;
}
system ("pause");
return 0;
}
8.4 结构体指针
作用:通过指针访问结构体中的成员
利用操作符 -> 可以通过结构体指针访问结构体属性
示例:
#include <iostream>
#include <string>
using namespace std;
//结构体指针
//定义学生结构体
struct student
{
string name; //姓名
int age; //年龄
int score;// 成绩
};
int main()
{
//1.创建学生结构体变量
struct student s = {"张三", 18 ,100}; //17,20行的struct均可省略
//2.通过指针指向结构体变量
struct student * p = &s;
//3.通过指针访问结构体变量中的数据
//通过结构体指针,访问结构体中的属性,需要利用 ->
cout << "姓名:" << p -> name << " 年龄:" << p-> age << " 成绩:" << p -> score << endl;
system ("pause");
return 0;
}
8.5 结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体
例如:一个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体
示例:
#include <iostream>
#include <string>
using namespace std;
//定义学生结构体
struct student
{
string name; // 学生姓名
int age;// 学生年龄
int score;// 学生分数
};
//定义老师结构体
struct teacher
{
int id; //教师编号
string name; //教师姓名
int age; //教师年龄
struct student stu; // 辅导的学生结构体
};
int main()
{
//结构体嵌套结构体
//创建老师
teacher t;
t.id = 10000;
t.name = "老王";
t.age = 50;
t.stu.name = "小王";
t.stu .age = 20;
t.stu .score = 80;
cout << "老师姓名:" << t.name << " 老师编号:" << t.id << " 老师年龄:" <<
t.age <<" 老师辅导学生的姓名:" << t.stu .name << " 老师辅导学生的年龄:"
<< t.stu .age << " 老师辅导学生的成绩:" << t.stu .score << endl;
system ("pause");
return 0;
}
8.6 结构体做函数参数
作用:将结构体作为参数向函数中传递
传递方式有两种:
1. 值传递
2. 地址传递
示例:
#include <iostream>
#include <string>
using namespace std;
//定义学生结构体:
struct student
{
string name;
int age;
int score;
};
// 打印学生信息的函数
//1.值传递
void printfStudent1 (struct student s)
{
s.age = 100;
cout << "子函数1中打印 姓名:" << s.name << " 年龄:" << s.age << " 成绩:" << s.score << endl;
}
//2.地址传递
void printfStudent2 (struct student * p)
{
p -> age = 300;
cout << "子函数2中打印 姓名:" << p -> name << " 年龄:" << p -> age << " 成绩:" <<p -> score << endl;
}
int main()
{
//结构体做函数参数
//将学生传入一个参数中,打印学生所有的信息
//创建学生结构体变量:
struct student s;
s.name = "张三";
s.age = 19;
s.score = 100;
//printfStudent1(s);
printfStudent2(&s);
cout << "main函数中打印 姓名:" << s.name << " 年龄:" << s.age << " 成绩:" << s.score << endl;
system ("pause");
return 0;
}
8.7 结构体中const使用场景
作用:用const来防止误操作
示例:
#include <iostream>
#include <string>
using namespace std;
//结构体中const使用场景
//定义结构体:
struct student
{
string name;//姓名
int age;//年龄
int score;//分数
};
//将函数中的形参改为指针,可以减少内存空间,而且不会复制一个新的副本出来
void printfStudents (const struct student * s )
{
//s -> age = 100;//加入const后,一旦有修改的操作就会报错,可以防止我们的五操作
cout << "姓名:" << s -> name << " 年龄:" <<s -> age << " 分数:" << s -> score << endl;
}
int main()
{
//创建结构体变量:
struct student s = {"张三", 18, 7};
//通过函数打印结构体变量信息:
printfStudents (&s);
cout << "main中张三的年龄为:" << s.age << endl;
system ("pause");
return 0;
}
8.8 结构体案例
8.8.1 案例1
案例描述:
学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下:
设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员
学生的成员有姓名,考试分数,创建数组存放3名老师,通过函数给每个老师及所有带的学生赋值
最终打印出老师数据以及老师所带的学生数据。
示例:
#include <iostream>
using namespace std;
#include <string>
#include <ctime>
//定义学生结构体
struct student
{
string sname; //学生姓名
int score; //学生考试分数
};
//定义老师结构体
struct teacher
{
string tname; //老师姓名
struct student sArray[5];//学生数组
};
void allocateSpace (struct teacher tArray[], int len)
{
for (int i = 0; i < len; i++)
{
string nameSeed = "ABCDE";
//给老师开始赋值:
tArray[i].tname = "Teacher_";
tArray[i].tname += nameSeed[i];
//通过循环给每名老师所带的学生赋值
for(int j = 0; j < 5; j++)
{
tArray[i].sArray[j].sname = "student_";
tArray[i].sArray[j].sname += nameSeed[j];
//int random =rand() % 60;//随机数0-59分
//int random =rand() % 61;//随机数0-60分
int random =rand() % 61 + 40;//随机数40-100分
tArray[i].sArray[j].score = random;
}
}
}
//打印所有信息的函数:
void printInfo (struct teacher tArray[],int len)
{
for(int i = 0;i < len;i++)
{
cout << "老师姓名:" << tArray[i].tname << endl;
for(int j = 0;j < 5; j++)
{
cout << "\t学生姓名:" << tArray[i].sArray[j].sname ;
cout << " 学生分数:" << tArray[i].sArray[j].score << endl;
}
}
}
int main()
{
//随机数种子
srand((unsigned int) time (NULL));
//1.创建3名老师的数组
struct teacher tArray[3];
//2.通过函数给3名老师及所有带的学生赋值
int len = sizeof(tArray) / sizeof(tArray[0]);
allocateSpace(tArray, len);
//3.打印所有老师及所带的学生信息
printInfo (tArray,len);
system ("pause");
return 0;
}
8.8.2 案例2
案例描述:
设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。
通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。
五名英雄信息如下:
{“刘备”,23,男},
{“关羽”,22,男},
{“张飞”,20,男},
{“赵云”,21,男},
{“貂蝉”,19,女},
示例:
#include <iostream>
using namespace std;
#include<string>
//1.定义英雄结构体
struct hero
{
string name;
int age;
string sex;
};
//冒泡排序 实现年龄升序排序
void bubbleSort(struct hero heroArray[],int len)
{
for(int i = 0; i < 5; i++)
{
for (int j = 0; j < 5-i-1; j++)
{
if( heroArray[j].age > heroArray[j+1].age )
{
struct hero temp = heroArray[j];
heroArray[j] = heroArray[j+1];
heroArray[j+1] = temp;
}
}
}
}
//打印排序后数组信息
void printhero(struct hero heroArray[],int len)
{
for(int i = 0; i < 5; i++)
{
cout << "姓名: " << heroArray[i].name << " 年龄:" << heroArray [i].age << " 性别:" << heroArray [i].sex << endl;
}
}
int main()
{
//2.创建英雄结构体数组,存放5名英雄
struct hero heroArray[5] =
{
{"刘备",23,"男"},
{"关羽",22,"男"},
{"张飞",20,"男"},
{"赵云",21,"男"},
{"貂蝉",19,"女"},
};
cout << "排序前:" << endl;
for(int i = 0; i < 5; i++)
{
cout << "姓名: " << heroArray[i].name << " 年龄:" << heroArray [i].age << " 性别:" << heroArray [i].sex << endl;
}
//3.冒泡排序对英雄的年龄进行升序排序
bubbleSort(heroArray,5);
//4.打印出来
cout << "排序后:" << endl;
printhero(heroArray,5);
system ("pause");
return 0;
}
该博客全面介绍了C++编程基础,涵盖基础语法、数据类型、运算符、程序流程结构、数组、函数、指针和结构体等内容。详细讲解各部分概念、语法规则,并配有示例和练习案例,帮助读者掌握C++编程基础。
1万+

被折叠的 条评论
为什么被折叠?



