1. 数组基础概念与核心原理
1.1 数组的本质与内存结构
数组是C语言中最基础也是最强大的数据结构之一。从内存角度看,数组实际上是一块连续的内存空间,用于存储相同类型的元素集合。这种连续存储特性带来两个关键优势:
- 随机访问高效性:通过下标可以直接计算出元素的内存地址(地址 = 首地址 + 下标 × 元素大小),时间复杂度为O(1)
- 缓存友好性:现代CPU的缓存预取机制对连续内存访问有优化
典型的数组内存布局示例(以int arr[5]为例):
code复制地址: 0x1000 0x1004 0x1008 0x100C 0x1010
值: arr[0] arr[1] arr[2] arr[3] arr[4]
注意:C语言不检查数组越界,这是许多安全漏洞的根源。实际编程中必须自行确保下标有效性。
1.2 数组声明与初始化实战
数组声明的基本语法看似简单,但实际使用中有多个变体需要注意:
c复制// 基础声明
int arr1[5]; // 未初始化,值随机
// 完全初始化
int arr2[5] = {1, 2, 3, 4, 5};
// 部分初始化(剩余元素自动补0)
int arr3[5] = {1, 2}; // => [1, 2, 0, 0, 0]
// 自动推导长度
int arr4[] = {1, 2, 3}; // 编译器自动计算长度为3
// C99新增指定初始化器
int arr5[5] = {[2] = 5, [4] = 9}; // => [0, 0, 5, 0, 9]
实际工程中推荐使用完全初始化或指定初始化器,避免未初始化导致的不可预测行为。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数组操作进阶技巧
2.1 数组遍历的多种姿势
基础的for循环遍历是最常见的方式,但实际开发中根据场景不同有多种优化写法:
c复制// 常规写法
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
printf("%d ", arr[i]);
}
// 指针遍历(更接近底层实现)
for(int *p = arr; p < arr + sizeof(arr)/sizeof(arr[0]); p++) {
