文章目录
- C++基础入门
-
-
- 1.初识C++
-
- [1.1 第一个C++程序](#1.1 第一个C++程序)
- [1.2 注释](#1.2 注释)
- [1.3 变量](#1.3 变量)
- [1.4 常量](#1.4 常量)
- [1.5 关键字](#1.5 关键字)
- [1.6 标识符命名规则](#1.6 标识符命名规则)
- 2.数据类型
-
- [2.1 整型](#2.1 整型)
- [2.2 sizeof关键字](#2.2 sizeof关键字)
- [2.3 浮点型(实型)](#2.3 浮点型(实型))
- [2.4 字符型](#2.4 字符型)
- [2.5 转义字符](#2.5 转义字符)
- [2.6 字符串型](#2.6 字符串型)
- [2.7 布尔类型 bool](#2.7 布尔类型 bool)
- [2.8 数据的输入](#2.8 数据的输入)
- 3.运算符
-
- [3.1 算术运算符](#3.1 算术运算符)
- [3.2 赋值运算符](#3.2 赋值运算符)
- [3.3 比较运算符](#3.3 比较运算符)
- [3.4 逻辑运算符](#3.4 逻辑运算符)
- 4.程序运行结构
-
- [4.1 选择结构](#4.1 选择结构)
-
- [4.1.1 if语句](#4.1.1 if语句)
- [4.1.2 三目运算符](#4.1.2 三目运算符)
- [4.1.3 switch语句](#4.1.3 switch语句)
- [4.2 循环结构](#4.2 循环结构)
-
- [4.2.1 while循环语句](#4.2.1 while循环语句)
- [4.2.2 do..while循环语句](#4.2.2 do..while循环语句)
- [4.2.3 for循环语句](#4.2.3 for循环语句)
- [4.2.4 嵌套循环](#4.2.4 嵌套循环)
- [4.3 跳转语句](#4.3 跳转语句)
-
- [4.3.1 break语句](#4.3.1 break语句)
- [4.3.2 continue语句](#4.3.2 continue语句)
- [4.3.3 goto语句](#4.3.3 goto语句)
- 5.数组
-
- [5.1 一维数组](#5.1 一维数组)
-
- [5.1.1 一维数组的定义方式](#5.1.1 一维数组的定义方式)
- [5.1.2 一维数组数组名](#5.1.2 一维数组数组名)
- [5.1.3 冒号排序](#5.1.3 冒号排序)
- [5.2 二维数组](#5.2 二维数组)
-
- [5.2.1 二维数组的定义方式](#5.2.1 二维数组的定义方式)
- [5.2.2 二维数组的数组名](#5.2.2 二维数组的数组名)
- 6.函数
-
- [6.1 函数的定义](#6.1 函数的定义)
- [6.2 函数的调用](#6.2 函数的调用)
- [6.3 值传递](#6.3 值传递)
- [6.4 函数的常见格式](#6.4 函数的常见格式)
- [6.5 函数声明](#6.5 函数声明)
- [6.6 函数的分文件编写](#6.6 函数的分文件编写)
- 7.指针
-
- [7.1 指针变量的定义和使用](#7.1 指针变量的定义和使用)
- [7.2 指针占内存空间大小](#7.2 指针占内存空间大小)
- [7.3 空指针](#7.3 空指针)
- [7.4 野指针](#7.4 野指针)
- [7.5 const修饰指针](#7.5 const修饰指针)
- [7.6 指针和数组](#7.6 指针和数组)
- [7.7 指针和函数](#7.7 指针和函数)
- 8.结构体
-
- [8.1 结构体的使用](#8.1 结构体的使用)
- [8.2 结构体数组](#8.2 结构体数组)
- [8.3 结构体指针](#8.3 结构体指针)
- [8.4 结构体嵌套结构体](#8.4 结构体嵌套结构体)
- [8.5 结构体做函数参数](#8.5 结构体做函数参数)
- [8.6 const修饰结构体变量](#8.6 const修饰结构体变量)
-
C++基础入门
1.初识C++
1.1 第一个C++程序
c++
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World!" << endl;
system("pause");
return 0;
}
1.2 注释
作用:在所编写的代码中添加解释和说明,方便其他程序员阅读代码。
两种格式:
1.单行注释://描述信息//
通常放在一行代码上方,对该行代码进行注释说明。
c++
#include <iostream>
using namespace std;
int main()
{
//cout << "Hello World!" << endl;
system("pause");
return 0;
}
2.多行注释:/* 描述信息*/
通常放在一端代码的上方,对该段代码进行整体注释说明。
c++
#include <iostream>
using namespace std;
/*int main()
{
cout << "Hello World!" << endl;
system("pause");
return 0;
}*/
补充:编译器在编译代码时,会省略掉注释的内容。
1.3 变量
作用:给一段指定的内存空间进行命名,以便进行相应的操作。
语法结构:数据类型 变量名 = 初始值;
c++
#include <iostream>
using namespace std;
int main()
{
char ch = 'a';
int a = 10;
float f = 3.14f;
cout << ch << endl;
cout << a << endl;
cout << f << endl;
system("pause");
return 0;
}
1.4 常量
作用:用于记录程序中不可被修改的数据。
两种方式:
1.#define 宏常量
语法结构:#define 常量名 常量值
2.const 修饰的变量
语法结构:#const 数据类型 常量名 = 常量值;
c++
#include <iostream>
using namespace std;
//宏定义
#define M 10
int main()
{
//const修饰的变量
const int a = 10;
M = 20; //报错
a = 30; //报错
system("pause");
return 0;
}
1.5 关键字
定义:预定义的保留标识符,对编译器有特殊意义。
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 | viod |
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++的关键字相同,否则会有歧义。
1.6 标识符命名规则
-
第一个字符必须是字母(不分大小写)或者下划线(__)。
-
标识符只能由字母(不分大小写)、数字、下划线(__)组成。
-
标识符中的大小写字母有区别。
-
标识符不能是编译系统预定定义的、有特殊用途的关键字同名。
2.数据类型
说明:在创建一个变量或常量时,必须要指定相对应的数据类型,不然无法给变量或常量分配内存。不同的数据类型,开辟的内存空间大小也不同。
数据类型 | 占用空间 | 取值范围 |
---|---|---|
char | 1个字节 | [-128,127]或[0, 255] |
unsigned char | 1个字节 | [0, 255] |
signed char | 1个字节 | [-128,127] |
int | 4个字节 | [-2147483648 ,2147483647] |
unsigned int | 4个字节 | [0 , 4294967295] |
signed int | 4个字节 | [-2147483648 , 2147483647] |
short int | 2个字节 | [-32768 , 32767] |
unsigned short int | 2个字节 | [0 , 65,535] |
signed short int | 2个字节 | [-32768 , 32767] |
long int | 8个字节 | [-9,223,372,036,854,775,808 , 9,223,372,036,854,775,807] |
signed long int | 8个字节 | [-9,223,372,036,854,775,808 , 9,223,372,036,854,775,807] |
unsigned long int | 8个字节 | [0 , 18,446,744,073,709,551,615] |
float | 4个字节 | 单精度型占4个字节内存空间,7位有效数字 |
double | 8个字节 | 双精度型占8 个字节内存空间,15~16位有效数字 |
long long | 16个字节 | [ -9,223,372,036,854,775,807 , 9,223,372,036,854,775,807] |
long double | 16个字节 | 长双精度型 16 个字节内存空间,18-19位有效数字。 |
wchar_t | 2个字节或4个字节 | 1 个宽字符 |
2.1 整型
作用:整型变量表示类型为整型的数据。
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short(短整型) | 2个字节 | [-32768 , 32767] |
int(整型) | 4个字节 | [-2147483648 ,2147483647] |
long(长整型) | 4字节(32位或8个字节(64位) | [-2147483648 ,2147483647] |
long long(长长整型) | 8个字节 | [ -9,223,372,036,854,775,807 , 9,223,372,036,854,775,807] |
2.2 sizeof关键字
作用:可以计算数据类型所占内存空间大小。
语法结构:sizeof(数据类型 / 变量)
c++
#include <iostream>
using namespace std;
int main()
{
int a = 10;
cout << sizeof(a) << endl;
cout << sizeof(char) << endl;
cout << sizeof(short) << endl;
cout << sizeof(int) << endl;
cout << sizeof(float) << endl;
cout << sizeof(double) << endl;
cout << sizeof(long) << endl;
cout << sizeof(long long) << endl;
system("pause");
return 0;
}
2.3 浮点型(实型)
作用:可表示有小数的数据。
两种类型:
-
单精度类型float
-
双精度类型double
区别:
数据类型 | 占用空间 | 有效数字范围 |
---|---|---|
float | 4个字节 | 7位有效数字 |
double | 8个字节 | 15~16位有效数字 |
c++
#include <iostream>
using namespace std;
int main()
{
float f = 3.14f;
double d = 2.13;
cout << f << endl;
cout << d << endl;
cout << sizeof(f) << endl;
cout << sizeof(d) << endl;
system("pause");
return 0;
}
2.4 字符型
作用:用于显示单个字符。
语法结构:char 变量名 = '初始值';
-
定义字符型变量时,要使用单引号括起来,不可使用双引号
-
字符型常量存储时不是把字符本身放入内存存储,而是将对应的ASCII编码存放入存储单元。
c++
#include <iostream>
using namespace std;
int main()
{
char ch = 'a';
ch = "b"; //报错
system("pause");
return 0;
}
ASCII码表:
大致由两部分组成:
-
ASCII非打印控制字符:0-31分配给了控制字符,用于控制打印机等一些外围设备。
-
ASCII打印字符:32-126分配给了可在键盘找到的字符。
ASCII值 | 控制字符 | ASCII值 | 字符 | ASCII值 | 字符 | ASCII值 | 字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | ' | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DC1 | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ' |
31 | US | 63 | ? | 95 | __ | 127 | DEL |
2.5 转义字符
作用:表示不能显示出来的ASCII值。
转义字符 | 含义 | 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位八进制 |
\xhh | 16进制转义字符,h范围A~F | 3位十六进制 |
c++
#include <iostream>
using namespace std;
int main()
{
cout << "\\" << endl;
cout << "\thello\tworld" << endl;
cout << "\n" << endl;
system("pause");
return 0;
}
2.6 字符串型
作用:用来表示一串字符。
两种形式:
1.C风格
语法结构:char 变量名[] = "字符串值";
2.C++风格
语法结构:string 变量名 = "字符串值";
c++
#include <iostream>
#include <string>
using namespace std;
int main()
{
char ch1[] = "abcd";
string ch2 = "efg";
system("pause");
return 0;
}
补充:
1.C风格的字符串在变量名后需要加[]。
2.C++风格的字符串,使用时需要引入头文件#include。
2.7 布尔类型 bool
作用:表示真或假的值。占用空间大小一个字节。
bool类型只有两种值:
-
true -- 真(本质是1)
-
false -- 假(本质是0)
c++
#include <iostream>
using namespace std;
int main()
{
bool n = true;
cout << n << endl;
n = false;
cout << n << endl;
cout << sizeof(bool) << endl;
system("pause");
return 0;
}
2.8 数据的输入
作用:从键盘获取输入数据。
关键字:cin
语法结构:cin >> 变量
c++
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cout << "请输入一个整型数据:" << endl;
cin >> n;
cout << n << endl;
system("pause");
return 0;
}
3.运算符
作用:用于代码的运算。
运算符类型 | 作用 |
---|---|
算术运算符 | 处理四则运算 |
赋值运算符 | 将表达式的值赋值给变量 |
比较运算符 | 表达式的比较,并返回一个真值或假值 |
逻辑运算符 | 根据表达式的值返回真值或假值 |
3.1 算术运算符
作用:处理四则运算。
运算符 | 术语 | 举例 | 结果 |
---|---|---|---|
+ | 正号 | +1 | 1 |
- | 负号 | -1 | 1 |
+ | 加 | 1+1 | 2 |
- | 减 | 1-1 | 0 |
* | 乘 | 2*5 | 10 |
/ | 除 | 10/2 | 5 |
% | 取模(取余) | 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; |
c++
#include <iostream>
using namespace std;
int main()
{
int num1 = 10;
int num2 = 5;
cout << num1 + num2 << endl;
cout << num1 - num2 << endl;
cout << num1 * num2 << endl;
cout << num1 / num2 << endl;
int num3 = 2;
int num4 = 0;
cout << cout3 / cout4 << endl; //报错,除数不可为0
system("pause");
return 0;
}
3.2 赋值运算符
作用:将表达式的值赋值给变量。
运算符 | 术语 | 举例 | 结果 |
---|---|---|---|
= | 赋值 | a=1; | a=1; |
+= | 加等于 | a=1;a+=2; | a=3; |
-= | 减等于 | a=1;a-=1; | a=0; |
*= | 乘等于 | a=1;a*=3; | a=3; |
/= | 除等于 | a=10;a/=2; | a=5; |
%= | 模等于 | a=10;a%=3; | a=1; |
c++
#include <iostream>
using namespace std;
int main()
{
int a = 10;
a = 20;
cout << "a=" << a << endl;
a += 10;
cout << "a=" << a << endl;
a -= 20;
cout << "a=" << a << endl;
a /= 2;
cout << "a=" << a << endl;
a *= 2;
cout << "a=" << a << endl;
a %= 3;
cout << "a=" << a << endl;
system("pause");
return 0;
}
3.3 比较运算符
作用:表达式的比较,并返回一个真值或假值。
运算符 | 术语 | 举例 | 结果 |
---|---|---|---|
== | 相等于 | 1 == 2 | 0 |
!= | 不等于 | 1 != 2 | 1 |
< | 小于 | 1 < 2 | 1 |
> | 大于 | 1 > 2 | 0 |
<= | 小于等于 | 1 <= 2 | 1 |
>= | 大于等于 | 1 >= 2 | 0 |
c++
#include <iostream>
using namespace std;
int main()
{
int a = 1;
int b = 2;
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 逻辑运算符
作用:根据表达式的值返回真值或假值。
运算符 | 术语 | 举例 | 结果 |
---|---|---|---|
! | 非 | !a | a为假,结果为真;a为真,结果为假 |
&& | 与 | a&&b | 全1出1,有0出0(1:真 0:假) |
| | 或 | a| |
c++
#include <iostream>
using namespace std;
int main()
{
int a = 1;
int b = 2;
cout << !a << endl;
cout << !!a << endl;
cout << (a && b) << endl;
cout << (a || b) << endl;
system("pause");
return 0;
}
4.程序运行结构
-
顺序结构:程序按顺序执行,不发生跳转
-
选择结构:判断条件是否满足,选择性区执行相应的代码
-
循环结构:判断条件是否满足,循环多次执行某段代码
4.1 选择结构
4.1.1 if语句
作用:执行满足条件的语句。
三种形式:
-
单行格式if语句
-
多行格式if语句
-
多条件格式if语句
c++
#include <iostream>
using namespace std;
//单行if语句
int main()
{
int score = 0;
cout << "请输入你的成绩:" << endl;
cin >> score;
if (score >= 60)
{
cout << "及格!" << endl;
}
system("pause");
return 0;
}
c++
//多行if语句
int main()
{
int score = 0;
cout << "请输入你的成绩:" << endl;
cin >> score;
if (score >= 80)
{
cout << "良好!" << endl;
}
else if (score >= 60)
{
cout << "及格!" << endl;
}
else
{
cout << "不及格!" << endl;
}
system("pause");
return 0;
}
c++
//多条件if语句
int main()
{
int score = 0;
cout << "请输入你的成绩:" << endl;
cin >> score;
if (score >= 80)
{
if (score >= 90)
cout << "优秀!" << endl;
else
cout << "良好!" << endl;
}
else if (score >= 60)
{
cout << "及格!" << endl;
}
else
{
cout << "不及格!" << endl;
}
system("pause");
return 0;
}
4.1.2 三目运算符
作用:通过三目运算实现简单的判断。
语法结构:表达式1 ? 表达式2:表达式3
说明:
如果表达式1的值为真,执行表达式2,并返回表达式2执行后的结果。
如果表达式1的值为假,执行表达式3,并返回表达式3执行后的结果。
c++
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 2;
int c = 0;
c = a > b ? a : b;
cout << c << endl;
(a > b ? a : b) = 5; //在C++中三目运算符返回的是变量,可以继续进行赋值操作。
cout << a << endl;
system("pause");
return 0;
}
4.1.3 switch语句
作用:执行多条件分支语句
语法结构:
c++
switch(表达式)
{
case 常量表达式1: 语句1;break;
case 常量表达式2: 语句2;break; '
case 常量表达式n: 语句n;break;
......
default: 语句n+1;
}
c++
#include <iostream>
using namespace std;
int main()
{
int day = 0;
cin >> day;
switch (day)
{
case 1:
cout << "星期一" << endl;
break;
case 2:
cout << "星期二" << endl;
break;
case 3:
cout << "星期三" << endl;
break;
case 4:
cout << "星期四" << endl;
break;
case 5:
cout << "星期五" << endl;
break;
case 6:
cout << "星期六" << endl;
break;
case 7:
cout << "星期天" << endl;
break;
default:
cout << "输入错误!" << endl;
break;
}
system("pause");
return 0;
}
补充:case中如果没有break,程序将会一直向下执行。
4.2 循环结构
4.2.1 while循环语句
作用:满足条件,执行语句。
语法结构:while(循环条件) {循环语句}
说明:只要循环条件的结果为真,就执行循环语句。
c++
#include <iostream>
using namespace std;
int main()
{
int num = 1;
while (num <= 10)
{
cout << num << endl;
num++;
}
system("pause");
return 0;
}
4.2.2 do...while循环语句
作用:满足条件,执行语句。
语法结构:do{循环语句} while(循环条件);
c++
#include <iostream>
using namespace std;
int main()
{
int num = 1;
do
{
cout << num << endl;
num++;
} while (num <= 10);
system("pause");
return 0;
}
补充:do...while与while的区别就是会先执行一次循环语句,再判断循环条件。
4.2.3 for循环语句
作用:满足条件,执行语句。
语法结构:for(表达式1;表达式2;表达式3){循环体语句;}
表达式1:
表达式1为初始化部分,用来进行循环变量赋值。
表达式2:
表达式2为条件判断部分,用来控制循环条件。
表达式3:
表达式3为调整部分,用来控制循环变量递增或递减。
c++
#include <iostream>
using namespace std;
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
cout << i << endl;
}
system("pause");
return 0;
}
4.2.4 嵌套循环
作用:在循环体中再嵌套一层循环,解决实际问题。
例如:打印一个10 x 10的矩形,就需要用到嵌套循环。
c++
#include <iostream>
using namespace std;
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10 ; j++)
{
cout << "* ";
}
cout << endl;
}
system("pause");
return 0;
}
4.3 跳转语句
4.3.1 break语句
作用:跳出选择结构或循环结构。
常用:
-
在switch条件语句中,终止case跳出switch
-
在循环语句中,跳出当前循环语句
-
在嵌套循环中,跳出最近的内存循环语句
c++
//switch条件语句
#include <iostream>
using namespace std;
int main()
{
int day = 0;
cin >> day;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
cout << "工作日" << endl;
break;
case 6:
case 7:
cout << "休息日" << endl;
break;
default:
cout << "error" << endl;
break;
}
system("pause");
return 0;
}
c++
//循环语句
#include <iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
break;
cout << i << endl;
}
system("pause");
return 0;
}
c++
//嵌套循环
#include <iostream>
using namespace std;
int main()
{
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语句
作用:在循环语句中,跳过本次循环中尚未执行的部分,执行下一次的循环。
c++
#include <iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
continue;
cout << i << endl;
}
system("pause");
return 0;
}
4.3.3 goto语句
作用:如果标记的名称存在,程序执行到goto语句时,将会跳转到标记的位置执行。
语法结构:goto 标记;
c++
#include <iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
goto end;
cout << i << endl;
}
end:
cout << "结束" << endl;
system("pause");
return 0;
}
5.数组
定义:数组就是一组存放相同类型的数据元素的集合,由连续的内存位置组成。
5.1 一维数组
5.1.1 一维数组的定义方式
三种方式:
-
数据类型 数组名[数组长度];
-
数据类型 数组名[数组长度] = {值1,值2,...值n};
-
数据类型 数组名[] = {值1,值2,...值n};
c++
#include <iostream>
using namespace std;
int main()
{
int arr1[5];
int arr2[5] = { 10,20,30,40,50 };
int arr3[] = { 60,70,80,90,100 };
//赋值
arr1[0] = 5;
arr1[1] = 15;
arr1[2] = 25;
arr1[3] = 35;
arr1[4] = 45;
//输出
cout << arr1[0] << endl;
cout << arr1[1] << endl;
cout << arr1[2] << endl;
cout << arr1[3] << endl;
cout << arr1[4] << endl;
//输出
for (int i = 0; i < 5; i++)
{
cout << arr2[i] << endl;
}
system("pause");
return 0;
}
5.1.2 一维数组数组名
作用:统计整个数组在内存中的长度,获取数组在内存中的首地址。
c++
#include <iostream>
using namespace std;
int main()
{
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;
cout << "数组首元素地址为:" << arr << endl;
cout << "数组第一个元素地址为:" << &arr[0] << endl;
cout << "数组第二个元素地址为:" << &arr[1] << endl;
arr = 10; //报错,数组名是常量不可进行赋值。
system("pause");
return 0;
}
5.1.3 冒号排序
作用:对数组内元素进行排序。
c++
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 3,5,8,2,7,9,6,4 };
int len = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
5.2 二维数组
定义:就是一个有行和列的矩阵,每一行代表一个数组。
5.2.1 二维数组的定义方式
4种方式:
-
数据类型 数组名 [行数][列数];
-
数据类型 数组名 [行数][列数] = { {值1, 值2}, {值3, 值4}};
-
数据类型 数组名 [行数][列数] = { 值1, 值2, 值3, 值4};
-
数据类型 数组名 [ ][列数] = { 值1, 值2, 值3, 值4};
c++
#include <iostream>
using namespace std;
int main()
{
int arr1[3][3];
int arr2[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
int arr3[3][3] = { 10,11,12,13,14,15,16,17,18 };
int arr4[][3] = { 19,20,21,22,23,24,25,26,27 };
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr2[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
5.2.2 二维数组的数组名
作用:查看二维数组所占内存空间大小,获取二维数组首地址。
c++
#include <iostream>
using namespace std;
int main()
{
int arr[3][3] = { 1,2,3,4,5,6,7,8,9 };
cout << "数组在内存中的大小为:" << sizeof(arr) << endl;
cout << "数组中每个元素在内存所占空间大小为:" << sizeof(arr[0][0]) << endl;
cout << "数组的元素个数为:" << sizeof(arr) / sizeof arr[0][0] << endl;
cout << "数组首元素地址为:" << arr << endl;
cout << "数组第一个元素地址为:" << &arr[0][0] << endl;
cout << "数组第二个元素地址为:" << &arr[0][1] << endl;
system("pause");
return 0;
}
6.函数
作用:将一段经常使用的代码封装起来,减少重复的代码。
6.1 函数的定义
语法结构:
c++
返回值类型 函数名(参数列表)
{
函数体语句
return表达式
}
c++
#include <iostream>
using namespace std;
int add(int num1, int num2)
{
return num1 + num2;
}
int main()
{
int num1 = 10;
int num2 = 20;
int ret = add(num1, num2);
cout << ret << endl;
system("pause");
return 0;
}
6.2 函数的调用
作用:使用定义好的函数。
语法结构:函数名(参数)
c++
#include <iostream>
using namespace std;
int Sub(int num1, int num2) //这边的num1,num2为形参
{
return num1 - num2;
}
int main()
{
int n1 = 10;
int n2 = 20;
//调用Sub函数
int ret = Sub(n1, n2); //这边的n1,n2为实参
cout << ret << endl;
system("pause");
return 0;
}
6.3 值传递
作用:函数调用时将数值传入形参。
c++
#include <iostream>
using namespace std;
void swap(int num1, int num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
cout << num1 << endl;
cout << num2 << endl;
}
int main()
{
int x = 10;
int y = 20;
swap(x, y);
cout << x << endl;
cout << y << endl;
system("pause");
return 0;
}
补充:形参发生,不会影响实参。
6.4 函数的常见格式
常见的函数格式有4种:
-
无参无返
-
有参无返
-
无参有返
-
有参有返
c++
#include <iostream>
using namespace std;
//无参无返
void test()
{
cout << "hello world" << endl;
}
//有参无返
void test2(int a)
{
cout << "this is test" << endl;
}
//无参有返
int test3()
{
return 1;
}
//有参有返
int test4(int a)
{
a += 2;
return a;
}
6.5 函数声明
作用:告诉便编译器函数名称以及如何调用函数。
c++
#include <iostream>
using namespace std;
//声明
int max(int x, int y);
int max(int x, int y);
int max(int x, int y);
//定义
int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int a = 10;
int b = 20;
int c = max(a, b);
cout << c << endl;
system("pause");
return 0;
}
补充:函数声明可多次,但定义只可一次。
6.6 函数的分文件编写
作用:让代码结构更清晰。
一般有4个步骤:
-
创建后缀名为.h的头文件
-
创建后缀名为.cpp的源文件
-
头文件写函数的声明
-
源文件写函数的定义
c++
//main.cpp
#include "swap.h"
int main()
{
int a = 10;
int b = 20;
swap(a, b);
system("pause");
return 0;
}
c++
//swap.h
#include <iostream>
using namespace std;
void swap(int x, int y);
c++
//swap.cpp
#include "swap.h"
void swap(int x, int y)
{
int temp = x;
x = y;
y = temp;
cout << x << endl;
cout << y << endl;
}
7.指针
作用:可通过指针间接访问内存。
7.1 指针变量的定义和使用
语法结构: 数据类型 * 变量名;
c++
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int* p = &a;
cout << "a的地址为:" << &a << endl;
cout << "指针p的地址为:" << p << endl;
*p = 20;
cout << "a的值为:" << a << endl;
cout << "指针p的值为:" << *p << endl;
system("pause");
return 0;
}eturn 0;
}
7.2 指针占内存空间大小
大小:在32位操作系统下占4个字节,64位操作系统下占8个字节。
c
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int* p = &a;
cout << sizeof(p) << endl;
cout << sizeof(char*) << endl;
cout << sizeof(float *) << endl;
cout << sizeof(double *) << endl;
//都是4个字节
system("pause");
return 0;
}
7.3 空指针
定义:指针变量指向内存编号为0的空间。
作用:初始化指针变量。
c++
#include <iostream>
using namespace std;
int main()
{
int* p = NULL;
*p = 100; //报错,内存编号0-255系统占用,不许用户进行访问
cout << *p << endl;
system("pause");
return 0;
}
补充:空指针指向的内存不可访问。
7.4 野指针
定义:指针变量指向非法的内存空间。
c++
#include <iostream>
using namespace std;
int main()
{
int* p = (int*)0x1234;
cout << *p << endl;
system("pause");
return 0;
}
7.5 const修饰指针
三种形式:
-
修饰指针 --- 常量指针
-
修饰常量 --- 指针常量
-
修饰指针与常量
c++
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 20;
//const修饰的是指针,指针所指向的地址的内容不可改,指针指向的地址可以改
const int* p1 = &a;
*p1 = 20; //报错
p1 = &b;
//const修饰的是常量,指针所指向的地址的内容可改,指针指向的地址不可改
int* const p2 = &a;
*p2 = 20;
p2 = &b; //报错
//const修饰的是常量与指针,指针所指向的地址的内容不可改,指针指向的地址不可改
const int* const p3 = &a;
*p3 = 20; //报错
p3 = &b; //报错
system("pause");
return 0;
}
7.6 指针和数组
作用:用指针访问数组元素。
c++
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int len = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
cout << "数组arr的第一个元素为:" << arr[0] << endl;
cout << "指针p访问的第一个元素为:" << *p << endl;
for (int i = 0; i < len; i++)
{
cout << *(p + i) << endl; //使用指针遍历数组
}
system("pause");
return 0;
}
7.7 指针和函数
作用:指针作为函数参数,可以修改实参的值。
c++
#include <iostream>
using namespace std;
void swap(int* num1, int* num2)
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int main()
{
int a = 10;
int b = 20;
cout << "before:" << endl;
cout << a << endl;
cout << b << endl;
swap(&a, &b);
cout << "after:" << endl;
cout << a << endl;
cout << b << endl;
system("pause");
return 0;
}
8.结构体
定义:一系列有相同类型或不同类型的数据构成的数据集合。
8.1 结构体的使用
语法结构:struct 结构体名 {结构体成员列表};
结构体创建变量的三种方式:
-
struct 结构体名 变量名
-
struct 结构体名 变量名 = {成员1, 成员2, ...成员n};
-
{}变量名;
c++
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
}stu1;
int main()
{
struct Student stu2;
struct Student stu3 = { 123456,"小明",20 };
stu2.id = 123457;
stu2.name = "小红";
stu2.age = 18;
cout << "学号:" << stu2.id << " " << "姓名:" << stu2.name << " " << "年龄:" << stu2.age << endl;
system("pause");
return 0;
}
8.2 结构体数组
作用:把自定义的结构体放入数组中方便后期维护。
语法结构:struct 结构体名 数组名[元素个数] = { {}, {}...{}};
c++
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
};
int main()
{
struct Student stu[3] = { {123456,"A",18},{123457,"B",20},{123458,"C",19} };
stu[1].age = 22;
stu[1].id = 123459;
stu[1].name = "D";
for (int i = 0; i < 3; i++)
{
cout << "学号:" << stu[i].id << " " << "姓名" << stu[i].name << " " << "年龄:" << stu[i].age << endl;
}
system("pause");
return 0;
}
8.3 结构体指针
作用:通过指针访问结构体中的成员。
c++
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
};
int main()
{
struct Student stu = { 123456,"小明",20 };
struct Student* p = &stu;
cout << "学号:" << p->id << " " << "姓名:" << p->name << " " << "年龄:" << p->age << endl;
system("pause");
return 0;
}
8.4 结构体嵌套结构体
作用:结构中的成员可以是另一个结构体。
c++
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
};
struct Teacher
{
string name;
int age;
struct Student stu;
};
int main()
{
struct Teacher teacher = { "E",26,{123456,"A",19} };
struct Teacher* p = &teacher;
cout << "老师姓名:" << p->name << " " << "老师年龄:" << p->age << endl;
cout << "学生学号:" << p->stu.id << " " << "学生姓名:" << p->stu.name << " " << "学生年龄:" << p->stu.age << endl;
system("pause");
return 0;
}
8.5 结构体做函数参数
作用:把结构体作为参数向函数传入。
两种传递方式:
-
值传递
-
地址传递
c++
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
};
//值传递
void print1(struct Student stu)
{
cout << "学号:" << stu.id << " " << "姓名" << stu.name << " " << "年龄:" << stu.age << endl;
}
//地址传递
void print2(struct Student* stu)
{
cout << "学号:" << stu->id << " " << "姓名" << stu->name << " " << "年龄:" << stu->age << endl;
}
int main()
{
struct Student stu = { 123456,"A",18 };
print1(stu);
print2(&stu);
system("pause");
return 0;
}
8.6 const修饰结构体变量
作用:防止误操作。
c++
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
};
void print(const Student* stu)
{
stu->age = 50; //报错
cout << "学号:" << stu->id << " " << "姓名" << stu->name << " " << "年龄:" << stu->age << endl;
}
int main()
{
struct Student stu = { 123456,"A",18 };
print(&stu);
system("pause");
return 0;
}