该系列为本人的学习笔记,主要由本人整理书写而成。部分内容来自教材、视频课程等,不能保证完全原创性。
萌新的学习笔记,写错了恳请斧正。
# 什么是数组
数组是一组相同类型元素的集合
数组分为一维数组和多维数组,多维数组一般只用二维
# 一维数组
# 一维数组的创建与初始化
# 创建
一维数组的创建方法如下:
// 一维数组创建 | |
type arr_name[常量]; |
type 规定数组元素的类型,如 char、int、short 等等
arr_name 就是我们自己起的数组名
方括号中的常量用来规定数组的大小,即元素容量
比方说可以这样创建数组:
int a[4]; | |
short b[5]; | |
char c[6]; |
# 初始化
在数组创建时,我们可以直接给予一些初始值:
// 完全初始化 | |
int arr[4] = {1, 2, 3, 4}; | |
// 不完全初始化 | |
int abc[3] = {6}; | |
// 错误的初始化,溢出 | |
int aaa[2] = {1, 2, 3} | |
// 不给常量的初始化 | |
int hhh[] = {1, 1, 4} |
不完全初始化时,数组从前往后获取元素, 未被初始化的元素默认为 0
初始化如果不给常量,就会根据所给的元素数量自动确定数组大小
一旦数组大小被确定就无法更改!!!
# 数组的类型
数组本身是有类型的,是一种自定义类型
我们创建数组的语句把其中的数组名去掉就是数组的类型
比如说:
char ch[10]; // 此数组类型为 char [10] | |
int num[5]; // 此数组类型为 int [5] | |
long lnum[7]; // 此数组类型为 long [7] |
# 数组的取用
# 数组下标
数组中每一个元素都有一个 “门牌号”, 称为数组下标
数组下标从 0 开始,即数组第一个元素的编号为 0, 随后为 1、2、3......
所以大小为 n 的数组最大编号为 n-1
# 下标引用操作符
C 语言提供了一个操作符用于提取数组中的元素,即一对英文方括号
下标引用操作符用于提取数组中的元素,用法如下:
a = arr[3];
此处便是将 arr 数组中数组下标为 3 的元素 (第四个) 赋值给了 a
# 数组的输入与输出
一般我们会通过 for 循环来执行数组的输入输出
# 输入
for (int i = 0; i < n; i++) //n 为数组长度 | |
scanf("%d", arr[i]); |
# 输出
for (int i = 0; i < n; i++) | |
printf("%d", arr[i]); |
# 一维数组在内存中的存储
一维数组在内存中线性递增的存储
也就是说,数组的每一个元素在内存中紧挨着依次增加
比方说一个 int 数组,第一个元素地址为 10000000, 第二个为 10000004, 随后是 10000008、1000000C、10000010...... 我们发现,每两个元素间相差 4 字节,这正好是 int 类型的长度。
# 获取数组元素的个数
我们可以使用之前提到的 sizeof 来获取数组的大小,而我们又知道数组每个元素的大小,那么相除就得到了数组元素的个数。如下为 int 数组元素个数:
sizeof(arr) / sizeof(arr[0]) | |
sizeof(arr) / sizeof(int) |
上面两种皆可,第一种比较泛用。
# 二维数组
二维数组可以理解为以一维数组为元素的数组
更高维度的以此类推
# 二维数组的创建
// 二维数组的创建 | |
type arr_name[常量1][常量2]; |
与一维数组类似,常量 1 代表行数,常量 2 为列数
也可以理解为 [常量 1] 个类型为 arrname [常量 2] 的一维数组集合成的数组
# 初始化
# 不完全初始化
从前往后填充,先填完第一个一维数组再填第二个,后面补 0
int arr[3][5] = {1,2};
# 完全初始化
int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
# 按行初始化 (完全)
int arr[2][3] = { {1,2,3},{4,5,6} };
# 按行初始化 (不完全)
每个一维数组剩下的补 0
int arr[2][3] = { {1,2},{4,5,6} };
# 初始化只能省略行不能省略列
int arr[][5] = { {1,2,3,4,5}, {3,4}, {5,6,7} };
# 二维数组的取用
与一维数组类似,行列都从 0 开始
a = arr[1][2];
上方即为把 arr 数组的第二行第三列赋值给 a
# 二维数组的输入输出
与一维类似,多嵌套一个 for 循环即可,内外循环分别遍历行号与列号,不赘述
# 二维数组在内存中的存储
与一维数组一致,二维数组元素也连续存放
二维数组中的每个一维数组间没有空隙
# 变长数组 (VLA)
C99 标准中引入了变长数组的概念
即可以使用变量来创建数组
这样,数组的大小在编译时不会被确定,而是在运行时确定
注意: 变长数组不是说数组长度可变。被确定大小后,无论那个变量再变成啥,数组的长度也不会改变了。
另外:Visual Stodio 采用 msvc 编译器,不支持变长数组 (但可以利用 malloc 来达到相同的目的)
gcc 编译器支持变长数组