目录

数组
数组的概念
数组的操作
字符数组(字符串)
多维数组


10 数组

10.1 数组的概念

① 数组四要素

1
2
3
4
数组名:本质上是标识符常量,需要符合标识符规范。
元素:数组中的成员,同一个数组中的元素必须是相同的数据类型。
下标:也称为索引、角标,就是元素的数字编号,是从0开始的连续数字;通过下标可以访问到数组中的某一个元素。
长度:元素的个数。

② C 语言数组特点(不用背)

1
2
3
4
(1)创建数组时会在内存中开辟一整块连续的空间,占据的空间的大小,取决于数组的长度和数组中元素的类型。
(2)数组中的元素在内存中是依次紧密排列的且有序的。
(3)数组一旦初始化完成,其长度就是确定的,数组的长度一旦确定,就不能修改。
(4)我们可以直接通过索引(下标)获取指定位置的元素,速度很快。

10.2 数组的操作

① 如何定义数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 1)方式一:先指定元素的个数和类型,再进行初始化(先声明,再初始化赋值)
int arr1[4];
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 300;
arr1[3] = 400;

// 2)方式二:指定元素的类型和个数并同时进行初始化(声明并同时初始化赋值)
double arr2[5] = {
1.5,
2.5,
3.5,
4.5,
5.5};

// 3)方式三:指定元素的类型,不指定元素个数,同时进行初始化(声明时不指定长度,必须同时进行初始化赋值);
short arr3[] = {10,20,30,40,50,60,70,80};

② 访问数组元素

1
数组名[下标]

③ 数组越界

1
合理的下标范围:0 ~ 长度-1; 如果使用不在合理范围内的下标,越界访问,访问的是数组之外的内存区域。

④ 数组长度计算

1
总的存储空间大小 / 单个元素的存储空间大小
1
2
3
sizeof 数组名 / sizeof 数组名[0];
// 或者
sizeof 数组名 / sizeof (元素的数据类型关键字)

⑤ 遍历数组

1
使用计数循环,让循环变量作为下标
1
2
3
4
for (int i = 0; i < 数组长度; i++)
{
数组名[i]; // 读写数组元素
}

10.3 字符数组(字符串)

① 字符串的本质

1
2
3
4
字符串就是由字符组成的数组
特点:
① 有专门的占位符 %s
② 字符串结尾,会自动添加一个 \0 作为字符串结束的标志,所以字符数组最后一个元素必须是 \0。

② 如何定义字符串

普通方式初始化

1
2
3
4
5
6
7
8
9
10
11
// 1. 手动添加字符串结束标记(\0)
char str1[9] = {'S', 'h', 'a', 'n', 'g', 'h', 'a', 'i', '\0'};
char str2[] = {'S', 'u', 'Z', 'h', 'o', 'u', '\0'};

// 2. 自动添加字符串结束标记(只要长度给的够大)
char str3[5] = {'W', 'u', 'X', 'i'};
char str4[15] = {'X', 'i', 'A', 'n'};

// 3. 不会自动添加字符串结束标记
char str5[4] = {'L', 'a', 'S', 'a'};
char str6[] = {'W', 'u', 'H', 'u'};

简写方式初始化:

1
2
3
4
// 方式一: 定义字符串  可以自动添加结束标记
char str1[] = {"Shanghai"};
// 方式一: 定义字符串 可以自动添加结束标记
char str2[] = "Beijing";

③ 字符串的访问和遍历

字符串长度计算:

1
2
sizeof: 字符串的内存存储大小就是字符串的长度,字符串的每个元素都是1字节
strlen(): 位于标准库头文件 <string.h> 中, 从第一个字符开始计数一直到字符串结束标记(不包括结束标记)

占位符:

1
%s :可以用来输出字符串。

10.4 多维数组

① 多维数组的概念

1
2
3
1. 如果数组的元素还是数组,这样的数组就称为多维数组。
2. 多维数组分为二维数组、三维数组等
3. 二维数组相关概念:行数、列数、行下标、列下标

② 二维数组的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 1. 先声明再初始化赋值   标识符arr1的类型是 int [3][2]
int arr1[3][2];
arr1[0][0] = 10;
arr1[0][1] = 20;
arr1[1][0] = 100;
arr1[1][1] = 200;
arr1[2][0] = 1000;
arr1[2][1] = 2000;

// 2. 定义二维数组:同时声明并初始化赋值,双层大括号
int arr2[3][4] = {
{10, 20, 30, 40},
{100, 200, 300, 400},
{1, 2, 3, 4}};

// 3. 定义二维数组:同时声明并初始化赋值; 一层大括号,可以自动分配
int arr3[2][4] = {100, 200, 300, 400, 10, 20, 30, 40};

// 4. 定义二维数组:同时声明并初始化赋值;一层大括号, 可以自动分配,省略行数
int arr4[][3] = {10,20,30,40,50,60};

③ 二维数组的访问和遍历

长度计算:

1
2
行数: sizeof 数组名 / sizeof 数组名[0]
列数: sizeof 数组名[0] / sizeof 数组名[0][0]

访问内层元素:

1
数组名[行下标][行下标]

④ 二维数组的内存形式

1
内存中,各元素是连续存放的,先顺序存放第一行的元素,再存放第二行的元素。