目录
- 引言
- 一维数组
- 数组的定义
- 数组的初始化
- 完全初始化
- 部分初始化
- 省略数组长度
- 数组元素的访问
- 多维数组
- 二维数组的定义
- 二维数组的初始化
- 完全初始化
- 部分初始化
- 省略第一维长度
- 二维数组元素的访问
- 遍历数组元素
- 遍历一维数组
- 遍历二维数组
- 数组作为函数参数
- 一维数组作为函数参数
- 二维数组作为函数参数
- 注意事项
- 数组越界
- 数组名作为指针
- 总结
引言
在 C 语言的世界里,数组是一种基础且强大的数据结构。它就像一个整齐排列的盒子,每个盒子都可以存放相同类型的数据。通过合理使用数组,我们能够高效地处理大量的数据。本文将从数组的基本概念入手,逐步深入探讨其在实际编程中的应用。
一维数组
数组的定义
在 C 语言中,定义一维数组的语法如下:
类型说明符 数组名[常量表达式];
这里的类型说明符决定了数组中每个元素的类型,比如int表示整数类型,float 表示浮点类型等。数组名是我们给这个数组起的名字,方便后续引用。而常量表达式则规定了数组的长度,也就是数组中元素的个数。
例如:
int scores[5];
这行代码定义了一个名为 scores 的整数数组,它可以存储 5 个整数。需要注意的是,常量表达式必须是一个常量或者常量表达式,不能是变量。
数组的初始化
数组的初始化有多种方式,下面我们来逐一介绍。
完全初始化
当我们知道数组中每个元素的值时,可以进行完全初始化。
int numbers[5] = {1, 2, 3, 4, 5};
在这个例子中,数组 numbers 的 5 个元素分别被初始化为 1、2、3、4、5。
部分初始化
如果只知道数组的部分元素值,其余元素会被自动初始化为 0。
int numbers[5] = {1, 2};
此时,numbers[0] 为 1,numbers[1] 为 2,而 numbers[2]、numbers[3] 和 numbers[4] 都为 0。
省略数组长度
当我们在初始化时提供了所有元素的值,可以省略数组的长度,编译器会自动根据初始化的值来确定数组的长度。
int numbers[] = {1, 2, 3, 4, 5};
这里数组 numbers 的长度被编译器确定为 5。
数组元素的访问
数组元素通过下标来访问,下标从 0 开始。例如,对于前面定义的numbers数组,numbers[0]表示数组的第一个元素,numbers[1]表示第二个元素,以此类推。
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
printf("The first element is: %d\n", numbers[0]);
printf("The third element is: %d\n", numbers[2]);
return 0;
}
在这段代码中,我们通过下标访问了数组numbers的第一个和第三个元素,并将它们打印输出。
多维数组
二维数组的定义
二维数组可以看作是一个矩阵,它的定义语法如下:
类型说明符 数组名[常量表达式1][常量表达式2];
常量表达式 1 表示数组的行数,常量表达式 2 表示数组的列数。
例如:
int matrix[3][4];
这定义了一个 3 行 4 列的二维数组matrix。
二维数组的初始化
二维数组的初始化也有多种方式。
完全初始化
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
这里,我们将二维数组 matrix 的每个元素都进行了初始化。
部分初始化
int matrix[3][4] = {
{1, 2},
{5},
{9, 10, 11}
};
未初始化的元素会被自动初始化为 0。
省略第一维长度
int matrix[][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
编译器会根据初始化的值自动确定第一维的长度。
二维数组元素的访问
二维数组元素通过行下标和列下标来访问,行下标和列下标都从 0 开始。
#include <stdio.h>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("The element at row 1, column 2 is: %d\n", matrix[1][2]);
return 0;
}
在这个例子中,我们访问了二维数组 matrix 中第二行第三列的元素。
遍历数组元素
遍历一维数组
for 循环是遍历一维数组最常用的方法,通过控制循环变量作为数组的下标来依次访问数组元素。
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int i;
// 遍历数组并打印每个元素
for (i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
遍历二维数组
对于二维数组,通常使用嵌套的 for 循环来遍历,外层循环控制行,内层循环控制列。
#include <stdio.h>
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int i, j;
// 外层循环控制行
for (i = 0; i < 3; i++) {
// 内层循环控制列
for (j = 0; j < 4; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
数组作为函数参数
数组可以作为函数的参数传递,这在处理大量数据时非常有用。
一维数组作为函数参数
当一维数组作为函数参数时,实际上传递的是数组的首地址。
#include <stdio.h>
// 函数声明
void printArray(int arr[], int size);
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
printArray(numbers, 5);
return 0;
}
// 函数定义
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
在这个例子中,函数 printArray 接受一个一维数组和数组的长度作为参数,并将数组中的元素打印输出。
二维数组作为函数参数
二维数组作为函数参数时,需要指定第二维的长度。
#include <stdio.h>
// 函数声明
void printMatrix(int matrix[][4], int rows);
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printMatrix(matrix, 3);
return 0;
}
// 函数定义
void printMatrix(int matrix[][4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
这里,函数 printMatrix 接受一个二维数组和数组的行数作为参数,并将二维数组的元素打印输出。
注意事项
数组越界
在访问数组时,一定要确保下标在合法范围内。如果下标超出了数组的长度,会导致未定义行为,可能会引发程序崩溃或产生不可预期的结果。
数组名作为指针
在大多数情况下,数组名会被隐式转换为指向数组首元素的指针。但在使用sizeof运算符时,数组名表示整个数组。
#include <stdio.h>
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
printf("The size of the array is: %zu\n", sizeof(numbers));
return 0;
}
在这个例子中,sizeof(numbers) 返回的是整个数组的大小,而不是指针的大小。
总结
C 语言数组是一种非常重要的数据结构,它可以帮助我们高效地处理大量相同类型的数据。通过掌握一维数组、多维数组的定义、初始化和访问,以及数组作为函数参数的使用方法,我们能够编写出更加高效、灵活的程序。同时,要注意数组越界等问题,避免程序出现错误。希望本文能帮助你更好地理解和使用 C 语言数组。