C语言数组之二维数组

C语言

主要内容

  • 数组
    • 二维数组

数组

二维数组

定义
  • 二维数组本质上是一个行列式的组合,也就是说二维数组由行和列两部分组成,属于多维数组。二维数组数据是通过行列进行解读。
  • 二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。(也就是说数组的元素的类型可以是数组类型)
语法:
数据类型 数组名[行数][列数]; // 二维数组外层表示行数,内层表示列数

举例:

int arr[3][3] = {{11,12,13},{21,22,23},{31,32,33}}; // 正确,等价于下面写法
int arr[][3] = {{11,12,13},{21,22,23},{31,32,33}}; // 正确,广义上称之为柔性数组

int arr[3][3] = {{11,12},{21,22,23},{31}}; // 正确,等价于下面写法
int arr[3][3] = {{11,12,0},{21,22,23},{31,0,0}};// 正确

int arr[3][3] = {}; // 正确,所有的元素使用0填充
int arr[3][3] = {{11}}; // 正确,未初始化的元素使用0填充

int arr[][] = {{11,12,13},{21,22,23},{31,32,33}}; // 错误,这种写法,会编译标错,不能省略列数
int arr[3][] = {{11,12,13},{21,22,23},{31,32,33}};// 错误,这种写法,会编译标错,不能省略列数

注意:在C语言中,二维数组在计算机的存储顺序是按行进行的,即第一维的(行)下标变化慢,第二维的(列)下标变化快。

应用场合

主要应用于数据有行列要求的情况。

特殊写法
  • 下标可以是整型表达式,如: a[2-1][2*2-1]

  • 下标可以是已经有值的变量或数组元素,如: a[2*x-1][b[3][1]]

  • 数组元素可以出现在表达式中,如: b[1][2] = a[2][3]/2

注意:使用数组元素的下标应在已定义数组的大小范围内;应注意区别定义数组大小和引用数组元素的区别。

初始化
  • 分行给二维数组赋初值

    int arr[3][4] = {{11,12,13,14},{21,22,23,24},{31,32,33,34}};
    
  • 可将所有数据写在一个花括号内,按照排列顺序对元素赋值

    int arr[3][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
    
  • 可对部分元素赋初值,其余未赋值部分自动填充整型默认值-0 | 字符型默认值-\0 | 浮点型默认值-0.0..

    int arr[3][4] = {{11},{21,22},{31}};
    
  • 若对全部元素赋初值,自定义数组时可以省略第1维数组的长度,第2维数组的长度必须指明。

    int a[][4] = {11,12,13,14,21,22,23,24,31,32,33,34};
    
  • 在分行赋初值时,也可以省略第1维的长度。

    int arr[][4] = {{11,12,13},{0},{0,10}};
    
二维数组的案例

案例1:

  • 需求:二维数组的遍历

  • 代码:

    #include <stdio.h>
    
    int main()
    {
        // 创建一个二维数组,经过论证,二维数据组必须指定列的大小,行的大小可以省略
        int arr[][3] = {{11},{21,22},{31,32,33}};
        
        // 获取二维数组的大小
        int r_len = sizeof(arr) / sizeof(arr[0]);
        
        // 遍历二维数组
        // 外层循环,遍历行元素(行元素是数组类型)
        for (int row = 0; row < r_len; row++)
        {
            // 获取行元素中列元素的个数
            int c_len = sizeof(arr[row]) / sizeof(int);
            // 内层循环,遍历列元素(列元素是单一类型)
            for (int col = 0; col < c_len; col++)
            {
                // 获取元素
                printf("%-3d",arr[row][col]); // 意思是获取数组arr第row行第col列
            }
        }
        
        printf("\n");
        return 0;
    }
    

案例2:

  • 需求:矩阵的转置(将一个2行3列的数组转换为3行2列的数组)

  • 代码:

    #include <stdio.h>
    
    // 定义行和列
    #define ROW 2
    #define COL 3
    
    int main()
    {
        // 准备2个数组用来存放转置前后的数列
        int arr_before[ROW][COL] = {{11,12,13},{14,15,16}};
        int arr_after[COL][ROW] = {0};
        
        // 计算arr_before的大小
        int r_len = sizeof(arr_before) / sizeof(arr_before[0]);
        // int c_len = sizeof(arr_before[0]) / sizeof(arr_before[0][0])
        
        // 遍历
        for (int i = 0; i < r_len; i++)
        {
            // 计算arr_before中行中的列数
            int c_len = sizeof(arr_before[i]) / sizeof(int);
            for (int j = 0; j < c_len; j++)
            {
                printf("%-4d",arr_before[i][j]);
                // 转置
                arr_after[j][i] = arr_before[i][j];
            }
            printf("\n");
        }
        printf("\n");
        
        // 遍历
        for (int i = 0; i < sizeof(arr_after)/sizeof(arr_after[0]);i++)
        {
            for (int j = 0; j < sizeof(arr_after[i]) / sizeof(int); j++)
            {
                printf("%-4d",arr_after[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        
        return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值