第九章——数组 第五节——二维数组的定义和初始化

第九章——数组 第五节——二维数组的定义和初始化

亓翎_Re-Tikara Lv5

二维数组的定义

定义方式

数据类型 数组名[常量表达式-表示行数][常量表达式-表示列数];

  例如:

1
2
3
4
int a[3][4];  
float b[2][5];
int c[2][3][4];
int a[3,4]; // 此种表示方法是错误的

数组元素的存放顺序

  • 前提:内存空间是一维等等
  • 二维数组:按照行序优化最快

  有如下二维数组

1
int a[3][2]

  则矩阵为

jvzhen.png

  数组元素存放顺序为:
.png

二维数组的理解

  二维数组理解为二维矩阵,矩阵的元素存放顺序为行序优化,即先把第一行的元素一个一个存放,然后第二行,第三行,依次类推。

二维数组的初始化

分行初始化

全部初始化

  有如下二维数组

1
2
3
4
int a[2][3] = 
{
{1,2,3},{4,5,6}
};

.png
  将二维数组中的元素全部按行声明。

部分初始化

  有如下二维数组

1
2
3
4
int a[2][3] = 
{
{1,2},{4}
};

  部分初始化,将数组的元素按行声明,剩余元素将初始化为0。
.png

第一维长度省略初始化

  关于这个,需要展开说说
  在C语言中,二维数组的分行初始化中省略第一维长度是指:在声明数组时,若通过初始化列表提供了所有元素的值,并且明确指定了第二维的长度,编译器会根据初始化列表中元素的总数和第二维的大小,自动推导出第一维的长度。这种省略方式使得代码更简洁,且避免了手动计算第一维的麻烦。


具体规则

  1. 必须指定第二维的长度
    例如:int arr[][3] = { ... };
    第二维的长度(这里是3)不能省略,因为编译器需要知道每行有多少个元素,才能正确分配内存并计算第一维的大小。

  2. 初始化列表中元素的总数必须能被第二维的大小整除
    编译器会将初始化列表中的所有元素按行优先(row-major)的顺序填充到数组中,并根据每行的大小(第二维长度)计算出第一维的大小。
    例如:

    1
    2
    3
    int arr[][3] = {1, 2, 3, 4, 5, 6}; // 初始化列表有6个元素,第二维长度为3  
    // 第一维大小 = 6 / 3 = 2
    // 等价于:int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
  3. 分行初始化时,每行的元素数量可以少于第二维的大小
    如果某行的初始化元素少于第二维的大小,剩余元素会自动补零。
    例如:

    1
    2
    int arr[][3] = {{1, 2}, {3}};  
    // 等价于:int arr[2][3] = {{1, 2, 0}, {3, 0, 0}};
  4. 分行初始化时,每行的元素数量不能超过第二维的大小
    否则会导致初始化列表的元素数量超出数组容量,引发编译错误或未定义行为。
    例如:

    1
    int arr[][3] = {{1, 2, 3, 4}, {5, 6}}; // 错误!第一行有4个元素,超过第二维大小3

示例解析

示例1:完整初始化
1
2
int matrix[][4] = { {1, 2, 3, 4}, {5, 6, 7, 8} };
// 第一维大小 = 2(初始化列表总共有8个元素,每行4个)
示例2:部分初始化
1
2
3
int matrix[][4] = { {1, 2}, {3} };
// 第一维大小 = 2
// 等价于:{{1, 2, 0, 0}, {3, 0, 0, 0}}
示例3:非分行初始化
1
2
3
int matrix[][4] = {1, 2, 3, 4, 5, 6, 7, 8};
// 第一维大小 = 8 / 4 = 2
// 等价于:{{1, 2, 3, 4}, {5, 6, 7, 8}}

注意事项

  1. 第二维长度不可省略
    如果省略第二维长度,编译器无法推导出每行的元素数量,导致错误。

    1
    int arr[][] = { {1, 2}, {3, 4} }; // 错误!第二维长度不可省略
  2. 避免越界风险
    如果初始化列表的元素数量不能被第二维大小整除,可能导致数组越界或未定义行为。

    1
    int arr[][3] = {1, 2, 3, 4, 5}; // 错误!5个元素无法被3整除
  3. 代码可读性
    省略第一维长度时,建议通过注释或命名清晰表达数组的逻辑结构,以提高代码可读性。


总结

  • 省略第一维长度:适用于初始化列表完整且第二维大小明确的场景。
  • 核心原理:编译器根据初始化列表的元素总数和第二维大小自动计算第一维长度。
  • 适用场景:适合数组元素固定且初始化列表已知的情况,例如静态配置表、矩阵等。

通过这种方式,开发者可以更灵活地定义数组,减少手动计算维度的负担,同时保持代码的清晰性。

按元素排列顺序初始化

全部初始化

  有如下二维数组

1
2
3
4
int a[2][3] = 
{
1, 2, 3, 4, 5, 6
};

.png

部分初始化

  有如下二维数组

1
2
3
4
int a[2][3] = 
{
{1,2,4}
};

  部分初始化,将数组的元素按行声明,剩余元素将初始化为0。
02.png
  与分行不同的是,此处全部放在了第一行,因此第二行全是0

第一位长度省略初始化

  详细和分行初始化差不多,但是依旧是,必须要有第二维的长度,然后所输入的内容,按列个数依次分行。

  • 标题: 第九章——数组 第五节——二维数组的定义和初始化
  • 作者: 亓翎_Re-Tikara
  • 创建于 : 2026-02-07 02:21:28
  • 更新于 : 2026-02-10 02:48:46
  • 链接: https://re-tikara.fun/Blog/posts/7f11a91f/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。