Skip to content

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};        // 编译器推断长度为 3

2. 多维数组

c
int m[2][3] = {
    {1,2,3},
    {4,5,6}
};
printf("%d\n", m[1][2]); // 6

3. 数组与指针的关系(衰变)

  • 在表达式或函数实参中,数组名会衰变为指向首元素的指针(类型为 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. 小结

正确处理长度与边界,理解数组衰变与多维传参,是使用数组的关键。

本站内容仅供学习和研究使用。