C++基础编程

C++初识

注释

  1. 单行注释

    1
    // 描述信息
  2. 多行注释

    1
    /* 描述信息 */

    提示:编译器在编译代码时,会忽略注释的内容

变量

  1. 作用:给一段指定的内存空间起名,方便操作这段内存

  2. 语法:数据类型 变量名 = 初始值;

  3. 注意:C++在创建变量时,必须给变量一个初始值,否则会报错

常量

作用:用于记录程序中不可更改的数据

C++定义常量两种方式

#define 宏常量: #define 常量名 常量值

  • 通常在文件上方定义,表示一个常量

const修饰的变量 const 数据类型 常量名 = 常量值

  • 通常在变量定义前加关键字const,修饰该变量为常量,不可修改

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
//常量的定义方式1.#defind 宏常量 2.const修饰的变量
//常量不可被修改
#define Day 7
int main2()
{
cout << "一个星期=" << Day << "天" << endl;
const int mooth = 12;//把变量变成常量
cout << "一个年有" << mooth << "月" << endl;
system("pause");
return 0;

}

关键字

  • 在定义变量或者常量时候,不要用关键字
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

标识符命名规则

作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则

  • 标识符不能是关键字
  • 标识符只能由字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字母区分大小写

数据类型

整型

作用:整型变量表示的是整数类型的数据

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)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
int main3()
{
//整形
//1.短整形 2字节 -32768-32768
short a = 1;

//2.整形 4字节
int b = 1;

//3.长整形 windos 4字节 L 8字节
long c = 1;

//4.长长整形 8字节
long long d = 1;

cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;

system("pause");
return 0;
}

sizeof关键字

作用:利用sizeof关键字可以统计数据类型所占内存大小

语法: sizeof( 数据类型 / 变量)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;
int main4()
{
//sizeof可以求出数据类型占用内存的大小
//语法:sizoef (数据类型或者变量)
int a = 40;
cout << "a所占用的空间为" << sizeof(a) << endl;

system("pause");
return 0;
}

实型(浮点型)

作用:用于表示小数

浮点型变量分为两种:

  1. 单精度float
  2. 双精度double

两者的区别在于表示的有效数字范围不同。

数据类型 占用空间 有效数字范围
float 4字节 7位有效数字
double 8字节 15~16位有效数字

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
int main5()
{
//单精度 float 4字节
//双精度 double 8字节
//默认情况下 输出一个小数 只会显示6位有效数字
float f1 = 3.14f;//没有加f的话,会默认为是双精度
double d1 = 3.14;
cout << f1 << endl;
cout << d1 << endl;
cout << "float的字节是" << sizeof(float) << endl;
cout << "doubled的字节是" << sizeof(double) << endl;

//科学计数法
float f2 = 3e2; //3*10^2
cout << f2 << endl;
float f3 = 3e-2; //3*0.1^2
cout << f3 << endl;


system("pause");
return 0;
}

字符型

作用:字符型变量用于显示单个字符

语法:char ch = 'a';

注意1:在显示字符型变量时,用单引号将字符括起来,不要用双引号

注意2:单引号内只能有一个字符,不可以是字符串

  • C和C++中字符型变量只占用1个字节。
  • 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII编码放入到存储单元

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main6()
{
//语法:char ?='?';
//只有1个字节,将对应的ASCII码存
char ch = 'A';
cout << ch << endl;
//常见错误:用"" 只能定义一个字符

cout << (int)ch << endl; //这个语法用来查看ASCII编码 A=65 a=97 差32


system("pause");
return 0;
}

转义字符

作用:用于表示一些不能显示出来的ASCII字符

现阶段我们常用的转义字符有: \n \\ \t

转义字符 含义 ASCII码值(十进制)
\a 警报 007
\b 退格(BS) ,将当前位置移到前一列 008
\f 换页(FF),将当前位置移到下页开头 012
\n 换行(LF) ,将当前位置移到下一行开头 010
\r 回车(CR) ,将当前位置移到本行开头 013
\t 水平制表(HT) (跳到下一个TAB位置) 009
\v 垂直制表(VT) 011
\ 代表一个反斜线字符”” 092
代表一个单引号(撇号)字符 039
代表一个双引号字符 034
? 代表一个问号 063
\0 数字0 000
\ddd 8进制转义字符,d范围0~7 3位8进制
\xhh 16进制转义字符,h范围09,af,A~F 3位16进制

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main7()
{
//转义字符
//用来表示一些不能显示出来的ASCII字符
//常用1.\n 换行 = endl;
int a = 2;
cout << "hello word\n";//不能在后面用<<

// 2.\t 水平制表 = 前面补完8位,用空格
cout << "aaa\tbbb\n";
cout << "aaaaa\tbbb" << endl;

// 3.\\表 \

cout << "\\" << endl;

字符串型

作用:用于表示一串字符

两种风格

  1. C风格字符串char 变量名[] = "字符串值"
  2. C++风格字符串string 变量名 = "字符串值"

注意:C++风格字符串,需要加入头文件#include

示例:

1
2
3
4
5
6
7
8
9
10
//字符串型
//C风格的字符串 char ?[]="????";
//注意 [] ""
char A[] = "hello word";
cout << A << endl;

//C++风格的字符串 string ?="????";
string B = "hello word";
cout << B << endl;
//注意 用string要先有头文件<string>

布尔类型 bool

作用:布尔数据类型代表真或假的值

bool类型只有两个值:

  • true — 真(本质是1)
  • false — 假(本质是0)

bool类型占1个字节大小

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int main8()
{
//创立一个bool数据类型 1字节 只要不是0,都代表真
//意义 1代表真 0代表假
bool flag = true; //true代表真
cout << flag << endl;

flag = false;//flase代表假
cout << flag << endl;

system("pause");
return 0;
}

数据的输入

作用:用于从键盘获取数据

关键字:cin

语法: cin >> 变量

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<string>
using namespace std;
int main9()
{
//输入字符 cin>>变量;
// 1.整形
int a = 0;
cout << "请给整型变量a赋值:" << endl;
cin >> a;
cout << "a=" << a << endl;

// 2.浮点型
double b = 3.14;
cout << "请给浮点型b赋值:" << endl;
cin >> b;
cout << "b=" << b << endl;

// 3.字符串型
string c = "hello word";
cout << "请给字符串c赋值:" << endl;
cin >> c;
cout << "c=" << c<< endl;

//4.字符型
char d = 'A';
cout << "请给字符型d赋值:" << endl;
cin >> d;
cout << "d=" << d << endl;

//5.布尔类型
bool E = true;
cout << "请给布尔类型E赋值:" << endl;
cin >> E;
cout << "E=" << E << endl;

system("pause");
return 0;
}

运算符

作用:用于执行代码的运算

本章我们主要讲解以下几类运算符:

运算符类型 作用
算术运算符 用于处理四则运算
赋值运算符 用于将表达式的值赋给变量
比较运算符 用于表达式的比较,并返回一个真值或假值
逻辑运算符 用于根据表达式的值返回真值或假值

算术运算符

作用:用于处理四则运算

算术运算符包括以下符号:

运算符 术语 示例 结果
+ 正号 +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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
using namespace std;
int main1()
{
//加减乘除,分母不得为0
int a1 = 3;
int b1 = 10;

cout << a1 + b1 << endl;
cout << a1 - b1 << endl;
cout << a1 * b1 << endl;
cout << a1 / b1 << endl;//整数/整数只能得到整数,小数部分去除,不是四舍五入

//两个小数可以相除
double a2 = 0.5;
double b2 = 0.6;

cout << a2 / b2 << endl;//结果可以是小数



//取模 %
cout << b1 % a1 << endl;
cout << a1 % b1 << endl;//取模数小时,是本身的值,也不能为0和小数


//递增递减
//前置递增 先让变量加1,再进行表达式运算
int a = 10;
int b = ++a * 10;
cout << a << endl;
cout << b << endl;

//后置d递增 先进行表达式运算,再让变量加1

int c = 10;
int d = c++ * 10;
cout << c << endl;
cout << d << endl;

system("pauce");
return 0;
}

赋值运算符

作用:用于将表达式的值赋给变量

赋值运算符包括以下几个符号:

运算符 术语 示例 结果
= 赋值 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;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;
int main2()
{
//=
int a = 10;
a = 100;//可以重新赋值
cout << a << endl;

//+=
a = 10;
a += 8;//a=a+8
cout << a << endl;

//-=
a = 10;
a -= 8; //a=a-8
cout << a << endl;

//*=
a = 10;
a *= 10;
cout << a << endl;
// /=
a = 10;
a /= 5;
cout << a << endl;

//%=
a = 10;
a %= 2; //a=a%2
cout << a << endl;

system("pause");
return 0;

}

比较运算符

作用:用于表达式的比较,并返回一个真值或假值

比较运算符有以下符号:

运算符 术语 示例 结果
== 相等于 4 == 3 0
!= 不等于 4 != 3 1
< 小于 4 < 3 0
> 大于 4 > 3 1
<= 小于等于 4 <= 3 0
>= 大于等于 4 >= 1 1

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
using namespace std;
int main3() {

//表比较,真的就返回1,假的就返回0
//不能连续使用两个,如a<b<c,因为a<b会返回1/0,导致c和1/0比,可以注意()的使用
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;
}

逻辑运算符

作用:用于根据表达式的值返回真值或假值

逻辑运算符有以下符号:

运算符 术语 示例 结果
! !a 如果a为假,则!a为真; 如果a为真,则!a为假。
&& a && b 如果a和b都为真,则结果为真,否则为假。
|| a || b 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
using namespace std;
int main()
{
// ! 非 真假取反
int a = 10;
cout << !a <<endl; //在C++中,除了0,都为真
cout << !!a << endl;//负负得正,得1

// && 与 左右都真,才真,否则为假
int b = 10;
cout <<( a && b )<< endl;

// || 或 一个为真,得真,两个为假,得假
int c = 0;
cout << (a || c) << endl;

system("pause");
return 0;
}

程序流程结构

C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构

  • 顺序结构:程序按顺序执行,不发生跳转
  • 选择结构:依据条件是否满足,有选择的执行相应功能
  • 循环结构:依据条件是否满足,循环多次执行某段代码

选择结构

if语句

作用:执行满足条件的语句

if语句的三种形式

  1. 单行格式if语句:if(条件){ 条件满足执行的语句 }
  2. 多行格式if语句:if(条件){ 条件满足执行的语句 }else{ 条件不满足执行的语句 };
  3. 多条件的if语句:if(条件1){ 条件1满足执行的语句 }else if(条件2){条件2满足执行的语句}... else{ 都不满足执行的语句}

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<iostream>
using namespace std;
int main1()
{
//单行if语句
//用户输入一个分数,大于650,则恭喜考上清华,不然则表遗憾
//1.让用户输入一个分数
cout << "请输入你的分数" << endl;
int a;
cin >> a;

// 2.判断是否大于650,if后面不要加;
if (a > 650)
{
cout << "恭喜考上清华大学!" << endl;
}


//多行格式if语句 多了else
else
{
cout << "很遗憾您没有考上清华大学" << endl;

}



// 多条件if语句
//同样是输入分数查看入取的大学等级
// 1.用户输入一个分数
cout << "请输入你的分数" << endl;
int b;
cin >> b;

// 2.当分数小于100,100-450,450-650,大于650,分级
if (b < 100)
{
cout << "很遗憾您没有考上大学" << endl;
}
else {
if ((b>100)&&(b<450)){ cout << "恭喜您考上了大专" << endl; }
else {
if ((b > 450) && (b < 650)) {
cout << "恭喜您考上了本科" << endl;
}
else cout << "恭喜您考上了国本" << endl;
}

}


//优化过的
cout << "请输入你的分数" << endl;
cin >> b;

// 2.当分数小于100,100-450,450-650,大于650,分级
if (b < 100)
{
cout << "很遗憾您没有考上大学" << endl;
}
else if (b<450) { cout << "恭喜您考上了大专" << endl; }
else if (b<650){cout << "恭喜您考上了本科" << endl;}
else { cout << "恭喜您考上了国本" << endl; }//每个else后面都加{}


//嵌套if语句 如果大于650,则判断,大于650人大,大于670清华,大于700北大

cout << "请输入你的分数" << endl;
cin >> b;

// 2.当分数小于100,100-450,450-650,大于650,分级
if (b < 100)
{
cout << "很遗憾您没有考上大学" << endl;
}
else if (b < 450) { cout << "恭喜您考上了大专" << endl; }
else if (b < 650) { cout << "恭喜您考上了本科" << endl; }
else {
cout << "恭喜您考上了国本" << endl; //每个else后面都加{}嵌套if语句 如果大于650,则判断,大于650人大,大于670清华,大于700北大
if (b < 670) { cout << "恭喜考上人大!" << endl; }
else if (b<700) { cout << "恭喜考上清华!" << endl; }
else{ cout << "恭喜考上北大!" << endl; }

}
system("pause");
return 0;
}

三目运算符

作用: 通过三目运算符实现简单的判断

语法:表达式1 ? 表达式2 :表达式3

解释:

如果表达式1的值为真,执行表达式2,并返回表达式2的结果;

如果表达式1的值为假,执行表达式3,并返回表达式3的结果。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
int main3()
{
// 表达式1 ? 表达式2 :表达式3
//如果表达式1为真,则执行表达式2,如果表达式1为假,则执行表达式3
//定义abc,a和b比较,大的赋值给c
int a=10, b=20, c=0;
a > b ? c = a : c = b;
cout << c << endl;

//老师的
c = (a > b ? a : b);
cout << c << endl;

//三目运算符返回的是变量,可以继续赋值

(a > b ? a : b) = 100;
cout << a << endl;
cout << b << endl;

system("pause");
return 0;
}

switch语句

作用:执行多条件分支语句

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
using namespace std;
int main4()
{
//电影打分反馈
//1.请用户打分
//10-9为超棒,8-7为棒,6-7为一般,小于6分为烂片
cout << "请你为该电影打分:" << endl;
int a = 0;
cin >> a;
switch (a) {
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;
default: cout << "您认为是烂片" << endl; break;
}

//if和Switch的区别
//if可以设定区间进行判断执行
//switch判断的时候只能是整形或字符型,不能是区间,但是结构清晰,执行效率高(只判断一次,if一路判断下去)


system("pause");
return 0;
}

循环结构

while循环语句

作用:满足循环条件,执行循环语句

语法: while(循环条件){ 循环语句 }

解释:只要循环条件的结果为真,就执行循环语句

注意在执行循环语句时候,程序必须提供跳出循环的出口,否则出现死循环

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;
int main5()
{
//while(循环条件) {循环语句}
//只要循环条件结果为真,就执行循环语句

//在屏幕中打出0-9,这10个数字
/*
int b;
int a = 0;
b = a++;
while (b < 10) { cout << b << endl; }*///我的错误

int a = 0;
while (a<10) {
cout << a << endl;
a++;
}

system("pauce");
return 0;
}

do…while循环语句

作用: 满足循环条件,执行循环语句

语法: do{ 循环语句 } while(循环条件);

注意:与while的区别在于do…while会先执行一次循环语句,再判断循环条件

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int main7()
{
int a = 0;
//do {循环语句} while()循环条件;
//与while的区别是 do...while会先执行一次循环,再进行判断
//do{ cout << a << endl; a++;}while (a); //先执行a++后,a>0,所以为真,会一直执行
//输出0~9

do { cout << a << endl; a++; } while (a < 10);

system("pauce");
return 0;
}

for循环语句

作用: 满足循环条件,执行循环语句

语法: for(起始表达式;条件表达式;末尾循环体) { 循环语句; }

示例:

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
int main9()
{
//for(起始表达式1;条件表达式2;末尾循环体3) {循环语句4}
//先1,然后判断2,执行4,然后3,再判断2-4-3
//输出1-9

for (int a = 0; a < 10; a++) { cout << a << endl;

}

嵌套循环

作用:可以分为内层和外层, 外层执行一次,内层执行一周

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
using namespace std;
int main10()
{

//打印*图
/*for (int a = 0; a < 11; a++) {
cout << "*"; for (int b = 0; a == 10; a = 0) { cout << " " << endl; b++; if (b == 10) { break; } } 思维误区
}*/

for (int a = 0; a < 11; a++) {
cout << " *";
}cout<<endl;

//将上面那一套再嵌套进一个重复10次的for循环
for (int b = 0; b < 10; b++) { //外层循环
for (int a = 0; a < 11; a++) { //内层循环 内层循环一次,外层才++一次 外层执行一次,内层执行一周
cout << " *";
}cout << endl;

}

system("pauce");
return 0;
}

跳转语句

break语句

作用: 用于跳出选择结构或者循环结构

break使用的时机:

  • 出现在switch条件语句中,作用是终止case并跳出switch
  • 出现在循环语句中,作用是跳出当前的循环语句
  • 出现在嵌套循环中,跳出最近的内层循环语句

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
using namespace std;
int main12()
{
//break语句 用于跳出选择结构和循环结构
//出现在swift语句中
cout << "请选择你的难度" << endl;
cout << "1.简单" << endl;
cout << "2.中等" << endl;
cout << "3.困难" << endl;
int a;
cin >> a;
switch (a) {
case 1:cout << "你选择了简单难度" << endl; break;
case 2:cout << "你选择了中等难度" << endl; break;
case 3:cout << "你选择了困难难度" << endl; break;
}
//出现在循环语句中

for (int a = 0; a < 10; a++) {
if (a == 5) { break; }
cout << "*" << endl; }

//出现在内嵌语句中
for (int b = 0; b < 10; b++) { for (int c = 0; c < 10; c++)
{
if (c == 5) { break; }cout << "*"; //可以退出内循环,不影响外循环
} cout << endl;
}

system("pauce");
return 0;
}

continue语句

作用:在循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

筛选条件,执行到此就不再向下

注意:continue并没有使整个循环终止,而break会跳出循环

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int main13()
{
//在循环语句中,跳过本次循环中剩下未执行的语句,继续执行下一次循环
//输出0~100中的奇数

for (int a = 0; a < 100; a++)
{
if(a % 2 == 0) { continue; } //可以筛选条件,执行到此就不再向下
cout << a << endl; }

system("pause");
return 0;
}

goto语句

作用:可以无条件跳转语句

语法: goto 标记;

解释:如果标记的名称存在,执行到goto语句时,会跳转到标记的位置

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
//可以无条件跳转语句;goto 标记,闪现到标记处 标记一般用大写

cout << "1" << endl;
cout << "2" << endl;
goto ABC;
cout << "3" << endl;
ABC:
cout << "4" << endl;

system("pause");
return 0;
}

数组

概述

所谓数组,就是一个集合,里面存放了相同类型的数据元素

特点1:数组中的每个数据元素都是相同的数据类型

特点2:数组是由连续的内存位置组成的

一维数组

一维数组定义方式

一维数组定义的三种方式:

  1. 数据类型 数组名[ 数组长度 ];
  2. 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
  3. 数据类型 数组名[ ] = { 值1,值2 ...};

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
using namespace std;
int main1()
{

//数组中每个数据元素都是相同的数据类型
// 数组是由连续的内存位置组成的
// 定义方法:
// 1.数据类型 数组名 [数组长度];
// 2.数据类型 数组名 [数组长度]={值0,值1....};
// 3.数据类型 数组名 [ ]={值0,值1.....};
// int arr arr[0],arr[1]..... [0][1]里面的数字叫下标,可以通过下标访问数组中的元素


// 1.数据类型 数组名 [数组长度];
int arr[5]; //利用下标进行初始化
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;

cout << arr[2] << endl;

// 2.数据类型 数组名 [数组长度]={值0,值1....};如果初始化的时候没有定义完,剩下的会用0代替
int A[5] = { 10,20,30,40,50 };
cout << A[2] << endl;


// 3.数据类型 数组名 [ ]={值0,值1.....};
int B[] = { 10,20,30,40,50 };
cout << B[2] << endl;


//可以利用循环,输出数组中的数
for (int i=0; i < 5; i++)
{
cout << B[i] << endl;

}

system("pause");
return 0;
}

一维数组数组名

一维数组名称的用途

  1. 可以统计整个数组在内存中的长度
  2. 可以获取数组在内存中的首地址

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
int main3()
{
int arr[5] = { 1,2,3,4,5 };
//1.可以统计整个数组在内存中的长度 sizeof ( arr )

cout<<sizeof(arr)<< endl; //1.可以统计整个数组在内存中的长度 sizeof ( arr )

cout<<sizeof(arr[2])<< endl; // 可以统计每个元素的内存长度 sizeof (arr[2])

cout << sizeof(arr) / sizeof(arr[0]) << endl; //可以统计元素的个数

//2.可以获取数组在内存中的首地址 cout << arr <<endl;是16进制的 可以
cout << arr << endl; cout << (int) arr << endl;


//数组中第一个元素的地址
cout <<(int)&arr[0]<<endl;


// 数组名是一个常量,不可赋值

system("pause");
return 0;
}

注意:数组名是常量,不可以赋值

总结1:直接打印数组名,可以查看数组所占内存的首地址

总结2:对数组名进行sizeof,可以获取整个数组占内存空间的大小

冒泡排序

作用: 最常用的排序算法,对数组内元素进行排序

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
  3. 重复以上的步骤,每次比较次数-1,直到不需要比较

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;
int main5()
{

//作用;
//1.将数组内的元素进行排列
// 比较相邻的元素,如果第一个比第二个大,就交换位置
// 对每一对相邻的元素都执行同样的工作,执行完毕后,找到第一个最大值
// 重复以上操作,每次比较次数-1,直到不需要比较

int c = 0;
int arr[10] = { 7,4,1,8,5,2,9,6,3,0 };
int d = sizeof(arr) / sizeof(arr[0])-1;
//for (int a = 0, b = 1; b < 10; a++, b++) { if (arr[a] > arr[b]) { c = arr[b]; arr[b] = arr[a]; arr[a] = c; } }

for (; d > 0; d--) {
for (int a = 0, b = 1; b < 10; a++, b++) { if (arr[a] > arr[b]) { c = arr[b]; arr[b] = arr[a]; arr[a] = c; } }
}

for (int f = 0; f < 10; f++) { cout << arr[f] << endl; }




//老师的
int h = 0;//临时空间
int arr1[10] = { 7,4,1,8,5,2,9,6,3,0 };
int g = sizeof(arr1) / sizeof(arr1[0]);//元素个数
for (int a = 0; a < 9; a++) //大循环,元素个数-1
{
for (int b = 1; g - b > 0; b++) { if (arr1[b - 1] > arr1[b]) { h = arr1[b - 1]; arr1[b - 1] = arr1[b]; arr1[b] = h; } }//小循环,次数=元素个数-当前轮数
}
for (int f = 0; f < 10; f++) { cout << arr1[f] << endl; }
system("pause");
return 0;
}

二维数组

二维数组就是在一维数组上,多加一个维度。

二维数组定义方式

二维数组定义的四种方式:

  1. 数据类型 数组名[ 行数 ][ 列数 ];
  2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
  3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
  4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};

建议:以上4种定义方式,利用第二种更加直观,提高代码的可读性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<iostream>
using namespace std;
int main6()
{
//定义
//1.数据类型 数组名 [ 行数 ] [列数] ;
//2.数据类型 数组名 [ 行数 ] [列数] ={ 数据1,数据2},{数据3,数据4};
//3.数据类型 数组名 [ 行数 ] [列数] ={数据1,数据2,数据3,数据4};
//4.数据类型 数组名 [ ] [列数] ={数据1,数据2,数据3,数据4};


//1.
int arr[3][3];
arr [0][0] = 1;
arr[0][1] = 2;


//2.
int arr1[2][3] =
{
{1,2,3},
{4,5,6}
};
for (int a = 0; a < 2; a++) //大循环用行数
{
for (int b = 0; b < 3; b++) { cout << arr1[a][b] << " "; }cout << endl;//小循环用列数
}
cout << arr1[0][0] << endl;


//3.
int arr2[2][3] = { 1,2,3,4,5,6 }; //系统自己自动分


//4.

int arr3[][3] = { 1,2,3,4,5,6 };//系统自己自动分


//通过数组名查看空间大小和首地址
cout << sizeof(arr1) << endl;
cout << sizeof(arr1[0]) << endl; //第一行的内存
cout << sizeof(arr1[0][0]) << endl; //第一个的内存
cout << sizeof(arr1[0])/sizeof(arr1[0][0]) << endl;//第一行的元素个数也是就是列数
cout << sizeof(arr1) / sizeof(arr1[0][0]) << endl;//全部元素个数

//首地址
cout <<(int)arr1 << endl;
cout << (int)arr1[0] << endl;// 第一行的首地址,同理可得其他
cout << (int)&arr1[0][0] << endl;//元素的地址

system("pause");
return 0;
}

二维数组数组名

  • 查看二维数组所占内存空间
  • 获取二维数组首地址

示例:

1
2
3
4
5
6
7
8
9
10
11
//通过数组名查看空间大小和首地址
cout << sizeof(arr1) << endl;
cout << sizeof(arr1[0]) << endl; //第一行的内存
cout << sizeof(arr1[0][0]) << endl; //第一个的内存
cout << sizeof(arr1[0])/sizeof(arr1[0][0]) << endl;//第一行的元素个数也是就是列数
cout << sizeof(arr1) / sizeof(arr1[0][0]) << endl;//全部元素个数

//首地址
cout <<(int)arr1 << endl;
cout << (int)arr1[0] << endl;// 第一行的首地址,同理可得其他
cout << (int)&arr1[0][0] << endl;//元素的地址

总结1:二维数组名就是这个数组的首地址

总结2:对二维数组名进行sizeof时,可以获取整个二维数组占用的内存空间大小

函数

函数的定义

函数的定义一般主要有5个步骤:

1、返回值类型

2、函数名

3、参数表列

4、函数体语句

5、return 表达式

作用:将一段经常使用的代码封装起来;减少重复代码,

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;

int add1(int num1, int num2)
{
int sum = num1 + num2;
return sum;
}

int main1()
{
//作用:将一段经常使用的代码封装起来;减少重复代码
//一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能


//实现一个加法函数,传入两个整形数据,计算数据相加的结果,并且返回
/*步骤
1.返回值类型 int
2.函数名 add
3.参数列表 (int num1,int num2)
4.函数体语句 int sum = num1 +num2;
5.return表达句 retuen sum;


语法
返回值类型 函数名 (参数列表)
{
函数体语句

return表达句
}

*/

system("pause");
return 0;
}

函数的调用

功能:使用定义好的函数

语法: 函数名(参数)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <iostream>
using namespace std;

int add2(int num1, int num2)//函数定义的时候,num1和num2并没有实际参数,只是一个形式参数,简称形参
{
int sum = num1 + num2;
return sum;

}

int main2()
{

// 语法 函数名(参数)
int a = 10;
int b = 20;
int c = add2(a, b);//a和b是有实际的值的,我们称为实际参数,简称实参 当调用函数时,实参会传递给形参
cout << c;


system("pause");
return 0;
}
  • 总结:函数定义里小括号内称为形参,函数调用时传入的参数称为实参

值传递

  • 所谓值传递,就是函数调用时实参将数值传入给形参
  • 值传递时,如果形参发生,并不会影响实参

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <iostream>
using namespace std;

//定义可以实现两个数字进行交换的函数
//如果一个函数不需要返回值,那么声明的时候可以写void

void swap1(int num1, int num2)
{
cout << "交换前a=" << num1 << endl;
cout << "交换前b=" << num2 << endl;

int c = 0;
c = num1, num1 = num2, num2 = c;
cout << "交换后a=" << num1 << endl;
cout << "交换后b=" << num2 << endl;

}

int main3()
{

//当调用函数时,实参会传递给形参,当值传递时,如果形参发生变化,并不会影响实参,num本身有内存空间,a和b传过去后就和a,b没有关系了
int a = 10;
int b = 20;
swap1(a, b);
cout << a << endl;
cout << b << endl;


system("pause");
return 0;
}

函数的常见样式

常见的函数样式有4种

  1. 无参无返
  2. 无参有返
  3. 有参无返
  4. 有参有返

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <iostream>
using namespace std;


// 1.无参无反

void A() {
cout << "66666" << endl;
}


// 2.无参有反

int B()
{
cout << "55555" << endl;

return 1000;
}

// 3.有参无反
void C(int a)
{
cout << "this is C=" << a << endl;
}


// 4.有参有反
int D(int c)
{
int f = c * 5;
return f;

}

int main4()
{

// 1.无参无反函数的调用
A(); //直接把函数抄出来


// 2.无参有反函数的调用

int b = B();
cout << b << endl;


//3.有参无反函数的调用

C(100);

// 4.有参有反函数的调用

int g = D(5);
cout << g << endl;





system("pause");
return 0;
}

函数的声明

作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

  • 函数的声明可以多次,但是函数的定义只能有一次

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <iostream>
using namespace std;
int max(int a, int b);//先声明,让编译器知道有这个函数,然后函数主体可以写在别的地方;

int main6()
{
//作用 告诉编译器函数的名称,以及如何调用函数;函数的实际主体可以单独定义
//函数的声明可以多次,但是函数的定义只能一次;

cout << max(500, 600) << endl;

system("pause");
return 0;
}

int max(int a, int b)
{
a < b ? b : a;
return a < b ? b : a; //返回值可以是函数主体
}

函数的分文件编写

作用:让代码结构更加清晰

函数分文件编写一般有4个步骤

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义
  • 头文件
1
2
3
4
5
#pragma once
#include <iostream>
using namespace std;
void swap(int a, int b);//实现两个数字交换的函数声明

  • 源文件
1
2
3
4
5
6
7
8
9
#include"swap.h"//引用自己的头文件用" "
void swap(int a, int b) {
int c;
c = a;
a = b;
b = c;
cout << a << endl;
cout << b << endl;
}
  • 函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include"swap.h"//自己写的头文件要用""进行引用
using namespace std;


int main()
{
/*
1.创建后缀名为.h的头文件
2.创建后缀名为.cpp的源文件 在最上面写 #include "头文件名"
3.在头文件中写函数的声明
4.在源文件中写函数的定义

*/
int a = 10;
int b = 20;

swap(a, b);

system("pause");
return 0;
}

指针

指针的基本概念

指针的作用: 可以通过指针间接访问内存(当数组储存的数据过大的时候,可以通过指针减少全部引用复制)

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

指针变量的定义和使用

指针变量定义语法: 数据类型 * 变量名;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
using namespace std;
int main1()
{
//指针的作用 可以通过指针间接访问内存
//内存编号是从0开始记录的,一般用16进制表示
//可以利用指针变量保存地址、指针就是一个内存地址,可以通过这个地址找到地址内存空间中的数据

//定义 数据类型 * 指针变量名

int a = 10;
int* p;
//让指针记录变量a的地址
p = &a;
cout << "a的地址为:" << &a << endl;
cout << "指针p的地址:" << p << endl;

//使用指针
//可以通过解引用的方式来找到指针指向的内存 访问和修改 *p
*p = 1000;
cout << a << endl; //通过解引用将数据带回地址并修改

//指针所占用的内存空间
//在32位操作系统下,4字节,不管是什么数据
//在64位系统下,是8字节
cout << sizeof(int*) << endl;

system("pause");
return 0;
}

指针所占内存空间

提问:指针也是种数据类型,那么这种数据类型占用多少内存空间?

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//指针所占用的内存空间
//在32位操作系统下,4字节,不管是什么数据类型
//在64位系统下,是8字节
cout << sizeof(int*) << endl;
int main() {

int a = 10;

int * p;
p = &a; //指针指向数据a的地址

cout << *p << endl; //* 解引用
cout << sizeof(p) << endl;
cout << sizeof(char *) << endl;
cout << sizeof(float *) << endl;
cout << sizeof(double *) << endl;

system("pause");

return 0;
}

空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

野指针:指针变量指向非法的内存空间

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
using namespace std;
int main2()
{

//空指针:指针变量指向内存中编号为0的空间;可以用来初始化指针变量,空指针指向的内存是不可访问的(0~255的内存是系统占用的,不可访问,会出错)

//初始化指针变量

int* p = NULL;//NULL代表0


//空指针指向的内存是不可访问的
// //*p = 100;//这里会出现错误


//野指针 指针变量指向非法的内存空间 会导致访问权限冲突 在程序中要避免野指针

int* pp = (int*)0x123456; //(int*) 16进制数 可表示一个内存地址

//cout << *pp;

//空指针和野指针都不是我们申请的空间,因此不要访问
system("pause");
return 0;
}

空指针和野指针都不是我们申请的空间,因此不要访问

const修饰指针

const修饰指针有三种情况

  1. const修饰指针 — 常量指针
  2. const修饰常量 — 指针常量
  3. const即修饰指针,又修饰常量

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<iostream>
using namespace std;
int main3()
{

// const可修饰指针 ----常量指针 -》指针方向可以修改
// const可修饰常量 ----指针常量 -》指针所指向的常量可以修改
// const或者即修饰变量又修饰常量 -》方向和常量都不可修改

// const可修饰指针
int a = 10;
int b = 20;

const int* p = &a;
// *p = 20;常量不能修改
p = &b;
cout << *p;

// const可修饰常量
int* const pp = &a;
*pp = 30;
//pp = &a;方向不能修改 就是const下一位对象不能修改

// const或者即修饰变量又修饰常量

const int* const ppp = &a;
//ppp=&b;方向和常量都不可修改
//*ppp=3;方向和常量都不可修改

system("pause");
return 0;
}

指针和数组

作用:利用指针访问数组中元素

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
int main4()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr; //arr本身就是一个地址 arr=arr[0]
cout << *p << endl;
p++; //因为p被定义为int,所以p++后向后移动4个字节得到arr【1】的地址
cout << *p << endl;


system("pause");
return 0;
}

指针和函数

作用:利用指针作函数参数,可以修改实参的值

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<iostream>
using namespace std;


//值传递 这个a1和b1有自己的内存空间,修改不会影响函数外面的main函数的值
void swap1(int a1, int b1) {
int c;
c = a1;
a1 = b1;
b1 = c;
}


//地址传递 实参的地址传递进去了,里面可以通过地址去修改实参

void swap2(int* p1, int* p2) //外面main的a和b的地址被里面函数的指针捕获

{
int f;
f = *p1;//解引用后,*p1里面的地址可以找到a,并访问和修改
*p1 = *p2;//解引用后,*p1和*p2的地址找到的a和b的值,并进行交换
*p2 = f;
}

int main6()
{
//利用指针作函数参数,可以修改实参的值
int a = 10;
int b = 20;
swap2(&a, &b);
cout << a << endl << b << endl;

system("pause");
return 0;
}

总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递

指针、数组、函数

案例描述:封装一个函数,利用冒泡排序,实现对整型数组的升序排序

例如数组:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

void max(int*ARR , int log)
{
for (int a=0;a<log-1;a++)
{

for (int b = 0; b < log - a - 1; b++)
{
int temp = 0;
if (ARR[b] > ARR[b + 1])
{
temp = ARR[b];// []可以加在任何地址后面,用来向后取内存,ARR[a]=*(ARR+a)
ARR[b] = ARR[b+1];
ARR[b+1] = temp;
}
}

}
}

int main()
{ //封装一个函数,利用冒泡排序,实现对整形数组的升序排序
int arr[] = { 1,4,7,8,5,2,9,10,6,3 };
int arr1[] = { 56,5,89,4,564,48,54,5,96,52,3,56,74,52 };
/*
1.先定义一个函数,里面用冒泡排序进行排序,最后利用指针进行地址传递,对外面的数组进行收据交换
*/
void max(int* arr, int log);
int log = sizeof(arr) / sizeof(arr[0]);
int log1 = sizeof(arr1) / sizeof(arr1[0]);

max(arr, log);
for (int a = 0; a < log; a++) { cout << arr[a] << endl; }
max(arr1, log1);
for (int a = 0; a < log1; a++) { cout << arr1[a] << endl; }


system("pause");
return 0;
}

总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针

结构体

结构体基本概念

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

结构体定义和使用

语法:struct 结构体名 { 结构体成员列表 };

通过结构体创建变量的方式有三种:

  • struct 结构体名 变量名
  • struct 结构体名 变量名 = { 成员1值 , 成员2值…}
  • 定义结构体时顺便创建变量

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
#include<string>
using namespace std;


int main1()
{
//结构体就是用户自定义的数据类型,允许用户储存不同的数据类型
//
// struct 结构体名 { 结构体成员列表 };
//
//创建学生数据类型,:学生包括(姓名,年龄,分数)
struct student { string name; int age; int score; }s3; //第三种定义方法

// 定义结构体变量(通过学生类型创建具体学生)
// struct 结构体名 变量名
// struct 结构体名 变量名={成员1值,成员2值....}
// 定义结构体时顺便创建变量
//
//1.
student s1; //创建变量的时候,struct可以省略,定义的结构体的时候不可以
//给s1赋值,通过 . 访问结构体变量中的属性
s1.name = "张三";
s1.age = 14;
s1.score = 78;
cout << " 姓名:" << s1.name << " 年龄:" << s1.age << " 成绩:" << s1.score << endl;

//2.
struct student s2 = { "李四",11,79};
cout << " 姓名:" << s2.name << " 年龄:" << s2.age << " 成绩:" << s2.score << endl;

//3.
s3.name = "王五";
s3.age = 13;
s3.score = 100;
cout << " 姓名:" << s3.name << " 年龄:" << s3.age << " 成绩:" << s3.score << endl;

system("pause");
return 0;
}

总结1:定义结构体时的关键字是struct,不可省略

总结2:创建结构体变量时,关键字struct可以省略

总结3:结构体变量利用操作符 ‘’.‘’ 访问成员

结构体数组

作用:将自定义的结构体放入到数组中方便维护

语法: struct 结构体名 数组名[元素个数] = { {} , {} , ... {} }

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<string>
using namespace std;


int main2()
{
//将自定义结构体放入数组中方便维护
//struct 结构体名 数组名 [元素个数]={ {},{},...}

struct student { string name; int age; int score; };

struct student arr[] = { {"张三",15,85},{"李四",17,90}, {"王五",17,100} };
//可以给结构体数组中的元素赋值
arr[2].name = "老六";

for (int a = 0; a < 3; a++) { cout << "姓名:" << arr[a].name << " 年龄:" << arr[a].age << " 成绩:" << arr[a].score << endl; }

system("pause");
return 0;

}

结构体指针

作用:通过指针访问结构体中的成员

  • 利用操作符 -> 可以通过结构体指针访问结构体属性

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<string>
using namespace std;

struct student { string name; int age; int score; };

int main3()
{
//通过指针访问结构体中的成员
//利用操作符->可以通过结构体指针访问结构体属性

student s = { "张三",18,80 };

//通过指针指向结构体变量
student* p = &s;

//通过指针访问结构体变量中的数据 p->
cout << "姓名:" << p->name << endl;

system("pause");
return 0;
}

结构体嵌套结构体

作用: 结构体中的成员可以是另一个结构体

例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include<iostream>
#include<string>
using namespace std;

struct student { string name; int age; int score; };
//要先定义被嵌套的结构体
struct teacher { string name; int DH; struct student stu; };

int main5()
{
//结构体中的成员可以是另一个结构体

//每个老师辅导一个学生,一个老师的结构体在记录一个学生的结构体

teacher A;
A.name = "老王";
A.DH = 18813379157;
A.stu.name = "张三";
A.stu.age = 18;
A.stu.score = 99;
cout << " 姓名:" << A.name << " 电话:" << A.DH << " 学生:" << A.stu.name <<" 学生年龄:"<<A.stu.age<<" 学生成绩"<<A.stu.score << endl;

//我自己的尝试结果
student C{ "张三",8,100 };
teacher B{ "老王",18813379175,C };
cout << " 姓名:" << B.name << " 电话:" << B.DH << " 学生:" << B.stu.name << " 学生年龄:" << B.stu.age << " 学生成绩" << B.stu.score << endl;
//即使可以通过将结构体名嵌套进结构体,但进行访问的时候还是要通过变量名来访问
system("pause");
return 0;
}

我的方法还没得到验证,不知有student D时会访问到谁的

结构体做函数参数

作用:将结构体作为参数向函数中传递

传递方式有两种:

  • 值传递
  • 地址传递

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
#include<string>
using namespace std;

struct student { string name; int age; int score; };

//值传递
void daying(student A)
{
cout << "姓名:" << A.name << " 年龄:" << A.age << " 成绩:" << A.score << endl;
}

//地址传递
void daying2(student* A)
{
A->age = 20;
cout << "姓名:" << A->name << " 年龄:" << A->age << " 成绩:" << A->score << endl;
}
int main4()
{ //将学生传的一个参数中,打印学生身上的所以信息
student s{ "张三",18,98 };
daying(s);
daying2(&s);
cout <<"在地址传递函数中修改后的年龄:"<< s.age << endl;
system("pause");
return 0;
}

结构体中 const使用场景

作用:用const来防止误操作

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<string>
using namespace std;

struct student1 { string name; int age; int score; };
//值传递,如果student a的数据量特别大,那么传进daying函数的时候会复制大量数据,如果地址传递,就可以不用复制,但是会修改内存数据,这时候要用const修饰它
void daying(student1 A)
{
cout << "姓名:" << A.name << " 年龄:" << A.age << " 成绩:" << A.score << endl;
}

void daying2(const student1* A)//将函数中的形参改为指针,可以减少内存空间,而且不会复制一个新的副本出来,常量指针的值不可修改,可访问

{

cout << "姓名:" << A->name << " 年龄:" << A->age << " 成绩:" << A->score << endl;
}
int main6()
{ //用const防止误操作(常量指针)
student1 s{ "张三",18,98 };


system("pause");
return 0;
}