C 数组(Arrays)
数组是存储同类型元素的顺序集合,内存连续。本章介绍一维/多维数组、初始化、传参与常见陷阱。
1. 一维数组
c
int a[5]; // 未初始化(局部变量为不确定值)
int b[5] = {1,2,3,4,5}; // 完全初始化
int c[5] = {0}; // 所有元素置 0
int d[] = {1,3,5}; // 编译器推断长度为 32. 多维数组
c
int m[2][3] = {
{1,2,3},
{4,5,6}
};
printf("%d\n", m[1][2]); // 63. 数组与指针的关系(衰变)
- 在表达式或函数实参中,数组名会衰变为指向首元素的指针(类型为 T*)
sizeof(a)在数组作用域内是整个数组的字节数,但在函数形参中sizeof得到的是指针大小
4. 作为函数参数
c
void fill(int *arr, int n, int v) {
for (int i = 0; i < n; ++i) arr[i] = v;
}
int main(void) {
int a[10]; fill(a, 10, 7);
}也可写作 void fill(int arr[], int n, int v),本质相同。
5. 边界与安全
- 严禁越界访问:
arr[i]必须满足0 <= i < N - 推荐传递长度参数,或使用结构封装(指针+长度)
6. 动态数组
- 使用
malloc/calloc/realloc/free管理动态数组,见内存管理章节
7. 二维数组传参
c
void print_mat(int r, int c, int m[][3]) { /* 第二维需已知 */ }或使用一维展开并自行计算索引:m[i * cols + j]
8. 常见陷阱
- 把数组当作值整体返回(C 不支持,需要结构体或指针)
- 在函数内
sizeof(param)不是数组总大小,而是指针大小
9. 小结
正确处理长度与边界,理解数组衰变与多维传参,是使用数组的关键。