椋鸟C语言笔记#11

数组

Featured image

萌新的学习笔记,写错了恳请斧正。

什么是数组

数组是一组相同类型元素的集合

数组分为一维数组和多维数组,多维数组一般只用二维

一维数组

一维数组的创建与初始化

创建

一维数组的创建方法如下:

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 编译器支持变长数组