在 C 语言中,数组是一种非常重要的数据结构,它可以将多个相同类型的元素组织在一起,以便于我们进行批量处理和操作。本文将详细介绍 C 语言中的一维数组和二维数组,包括它们的定义、初始化、元素访问以及内存存储等方面的内容。
一、数组基本概念
数组是一组相同类型元素的集合,这些元素在内存中占据连续的存储空间。数组的元素可以通过下标来访问,下标从 0 开始。C 语言支持一维数组、二维数组以及多维数组,本文主要讨论一维数组和二维数组。
二、一维数组
(一)一维数组的定义
在 C 语言中,定义一维数组的一般形式为:
数据类型 数组名[数组长度];
其中,数据类型可以是 int、float、char 等基本数据类型,也可以是结构体等用户自定义数据类型;数组名是一个标识符,用于标识这个数组;数组长度必须是一个常量表达式,表示数组中元素的个数。
例如,定义一个包含 5 个整型元素的数组:
int arr[5];
(二)一维数组的初始化
在定义数组的同时,可以对数组进行初始化,一维数组的初始化方式有以下几种:
1.完全初始化:给数组的每个元素都赋初值。
int arr[5] = {1, 2, 3, 4, 5};
2.不完全初始化:只给数组的前几个元素赋初值,后面未赋值的元素会自动初始化为 0(对于整型数组)或 0.0(对于浮点型数组)。
int arr[5] = {1, 2}; // 等价于{1, 2, 0, 0, 0}
3.省略数组长度初始化:在初始化时不指定数组的长度,编译器会根据初始化列表中的元素个数自动确定数组的长度。
int arr[] = {1, 2, 3, 4, 5}; // 数组长度为5
(三)一维数组元素的访问
数组元素可以通过下标来访问,下标的范围是 0 到数组长度减 1。例如,对于上面定义的数组 arr,它的元素可以表示为 arr [0]、arr [1]、arr [2]、arr [3]、arr [4]。
我们可以通过赋值语句给数组元素赋值,也可以通过输入函数从键盘读取值赋给数组元素。例如:
scanf("%d", &arr[1]);
(四)一维数组的内存存储
一维数组中的元素在内存中是按照元素的顺序连续存储的,每个元素占据的存储空间大小由数据类型决定。例如,对于 int 类型的数组,每个元素占据 4 个字节(在 32 位系统中)。数组名代表数组在内存中的首地址,即第一个元素的地址。
三、二维数组
(一)二维数组的定义
二维数组可以看作是一维数组的数组,即每个元素又是一个一维数组。在 C 语言中,定义二维数组的一般形式为:
数据类型 数组名[行长度][列长度];
其中,行长度表示二维数组的行数,列长度表示每行的列数,它们都必须是常量表达式。
例如,定义一个 3 行 4 列的整型二维数组:
int arr[3][4];
(二)初始化二维数组的初始化
二维数组的初始化方式有以下几种:
1.按行初始化:将二维数组的每一行元素用花括号括起来,逐行进行初始化。
int arr[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
2.按顺序初始化:将所有元素按行优先的顺序放在一个花括号中进行初始化。
int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};
3.不完全初始化:只给部分元素赋初值,未赋值的元素会自动初始化为 0。
int arr[3][4] = {{1,2},{2,3,4},{3}};
此时,数组第一行前两个元素为1,2,后两个元素为0;第二行前三个元素为2,3,4,第四个元素为0;第三行第一个元素为3,其余元素均为0。
4.省略行长度初始化:在初始化时可以省略行长度,但不能省略列长度,编译器会根据初始化列表中的元素个数和列长度自动确定行长度。
int arr[][4] = {{1, 2, 3, 4}, {2,3,4,5}, {3,4,5,6}};
(三)访问二维数组元素
二维数组元素的访问需要使用两个下标,第一个下标表示行,第二个下标表示列,下标均从 0 开始。例如,对于上面定义的数组 arr,它的元素可以表示为 arr [i][j],其中 i 的取值范围是 0 到 2,j 的取值范围是 0 到 3。
(四)二维数组的内存存储
二维数组在内存中也是连续存储的,它按照行优先的顺序存储,即先存储第一行的所有元素,然后存储第二行的所有元素,以此类推。例如,对于 3 行 4 列的二维数组 arr,其元素在内存中的存储顺序为 arr [0][0]、arr [0][1]、arr [0][2]、arr [0][3]、arr [1][0]、arr [1][1]、arr [1][2]、arr [1][3]、arr [2][0]、arr [2][1]、arr [2][2]、arr [2][3]。
二维数组名代表数组在内存中的首地址,即第一行第一个元素的地址。arr [i] 表示第 i 行的首地址,arr [i] 就相当于一个一维数组名。
四、数组使用注意事项
1.数组下标不能越界,否则会导致未定义行为,可能会破坏内存中的其他数据,甚至导致程序崩溃。
2.数组名是一个常量指针,不能对其进行赋值操作。例如,arr = arr + 1; 是错误的。
3.在传递数组参数时,通常需要同时传递数组的长度,因为在函数参数中,数组会退化为指针,无法获取数组的长度。