前言
在 C 语言中,数组(Array) 是一种存储多个相同类型数据的线性数据结构,在算法、数据处理、内存管理等方面都有广泛的应用。掌握数组的使用方式,不仅能提高代码的效率,还能帮助我们理解 C 语言的底层存储原理。
本文将带你深入剖析 C 语言数组,从基础概念到多维数组、指针与数组的关系、数组与函数的交互,让你全面掌握数组的使用方法。
一、数组的基础概念
1. 什么是数组?
数组是一组相同数据类型的连续存储的元素集合。每个元素都有一个索引(Index),可以通过索引访问和修改元素。
2. 数组的特点
✅ 元素类型相同:数组中的所有元素必须是相同的数据类型(如 int、float、char)。
✅ 内存地址连续:数组在内存中占据连续的存储空间,访问效率高。
✅ 索引从 0 开始:数组的索引默认从 0 开始,而不是 1。
3. 数组的声明与初始化
(1)声明数组
数据类型 数组名[数组长度];
示例:
int numbers[5]; // 声明一个包含 5 个整数的数组
(2)数组初始化
方式 1:声明时直接初始化
int numbers[5] = {1, 2, 3, 4, 5}; // 定义并初始化
方式 2:部分初始化(未初始化的元素默认为 0)
int numbers[5] = {1, 2}; // 其余元素默认为 0
方式 3:省略数组长度(编译器自动计算)
int numbers[] = {10, 20, 30}; // 数组大小自动推导为 3
二、数组的访问与修改
数组元素可以通过索引访问:
#include
int main() {
int arr[5] = {10, 20, 30, 40, 50};
printf("第 1 个元素:%d\n", arr[0]); // 访问第一个元素
arr[2] = 100; // 修改数组元素
printf("修改后,第 3 个元素:%d\n", arr[2]);
return 0;
}
输出:
第 1 个元素:10
修改后,第 3 个元素:100
三、数组的遍历
数组的遍历通常使用 for 循环 或 while 循环:
#include
int main() {
int arr[] = {5, 10, 15, 20, 25};
int size = sizeof(arr) / sizeof(arr[0]); // 计算数组大小
// 使用 for 循环遍历数组
for (int i = 0; i < size; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
return 0;
}
输出:
arr[0] = 5
arr[1] = 10
arr[2] = 15
arr[3] = 20
arr[4] = 25
四、数组的内存存储原理
假设我们定义了如下数组:
int arr[4] = {10, 20, 30, 40};
假设 arr 在内存中的起始地址为 1000,则内存布局如下(假设 int 类型占 4 字节):
索引值内存地址arr[0]101000arr[1]201004arr[2]301008arr[3]401012
C 语言数组的存储方式是 顺序存储,这使得数组可以通过指针运算进行高效访问。
五、指针与数组的关系
在 C 语言中,数组名实际上是一个指向数组首元素的指针,所以 arr 等价于 &arr[0]。
#include
int main() {
int arr[3] = {10, 20, 30};
int *p = arr; // p 指向数组首地址
printf("使用指针访问数组元素:\n");
printf("%d %d %d\n", *(p), *(p + 1), *(p + 2));
return 0;
}
输出:
10 20 30
解释:
*(p) 等价于 arr[0]
*(p + 1) 等价于 arr[1]
*(p + 2) 等价于 arr[2]
六、二维数组
二维数组可以看作是一个“数组的数组”,即每一行都是一个一维数组。
1. 声明与初始化
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
2. 访问二维数组
#include
int main() {
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
printf("matrix[1][2] = %d\n", matrix[1][2]); // 访问第 2 行,第 3 列
return 0;
}
输出:
matrix[1][2] = 6
3. 遍历二维数组
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
七、数组作为函数参数
数组可以作为函数参数进行传递,但实际上传递的是数组的首地址:
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int numbers[] = {1, 2, 3, 4, 5};
int size = sizeof(numbers) / sizeof(numbers[0]);
printArray(numbers, size);
return 0;
}
输出:
1 2 3 4 5
注意: 在函数参数中,arr[] 只是一个指针,不包含数组大小信息,所以要额外传递 size 作为参数。
八、总结
✅ 数组是 C 语言中最重要的数据结构之一,具有类型统一、顺序存储、索引访问等特性。
✅ 数组的索引从 0 开始,存储在连续的内存地址中。
✅ 数组名是指向首元素的指针,可以使用指针运算访问数组元素。
✅ 多维数组的存储结构是按行存储,可以使用嵌套循环遍历。
✅ 传递数组给函数时,实际上传递的是数组的首地址,所以需要额外传递大小参数。
掌握这些知识,将帮助你更高效地使用 C 语言数组,编写出更优化的代码!🚀