当前位置: 首页 > news >正文

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;
    }
    

相关文章:

  • MySQL创建视图
  • 基站天线的优化策略
  • docker安装mysql:8.0
  • 【探商宝】:大数据与AI赋能,助力中小企业精准拓客引
  • [LeetCode力扣hot100]-二叉树相关手撕题
  • [LeetCode力扣hot100]-C++常用数据结构
  • 段错误 (核心已转储)
  • 网络工程师 (44)ARP协议
  • 【九】Golang 数组
  • 由application绑定失败引起的ANR
  • IMX6ULL的ALT0、ALT1、ALT2、ALT3、ALT4等是啥意思?
  • Burp Suite基本使用(web安全)
  • iOS事件传递和响应
  • 车载软件架构 --- 软件开发在造车流程中的位置
  • 静态路由协议知识要点总结
  • C语言中printf()函数何时把内容输出到屏幕上?
  • Java 基于 SpringBoot+Vue 的动漫平台(附源码,文档)
  • 嵌入式开发:接触器
  • 安卓burp抓包,bypass ssl pinning
  • 同步异步日志系统-日志落地模块的实现
  • 网站建设哪家公司靠谱/bt磁力搜索神器
  • 为什么自己做的网站别人打不开/电商seo搜索优化
  • 如何做导购网站/关键词seo排名怎么做的
  • 网站制作新技术/网购平台推广方案
  • 网站服务器怎么维护/西安百度seo推广
  • 网站建设企业实践日志/岳阳seo公司