从头学习C语言之二维数组

让我来详细讲解一下从头学习C语言之二维数组的完整攻略。

什么是二维数组?

在开始讲解二维数组之前,我们先来回顾一下什么是一维数组。一维数组是相同类型元素的集合,元素在内存中是连续分配的。类似于一排柜子,每个柜子可以存放一个元素。而二维数组,就是由一系列的一维数组组成的。我们可以将二维数组看作是一个由行和列组成的表格,其中每个元素都有一个对应的行和列。在内存中,二维数组的元素是按行排列的。类似于一个存放物品的仓库,每个仓位可以存放一个元素,而这些仓位按照“行”和“列”排列。

声明和初始化二维数组

C语言中,声明和初始化一个二维数组的方式如下:

data_type array_name[row_size][column_size];

其中,data_type表示数组中元素的类型,array_name表示数组的名字,row_size是二维数组中行的数量,column_size是二维数组中列的数量。

例如,声明一个3行4列的整型数组,可以写成:

int arr[3][4];

二维数组的初始化可以分为两种方式,静态初始化和动态初始化。静态初始化是指在定义数组时直接给出数组中的元素值。动态初始化是指在定义数组时不给出元素值,而是在程序运行时通过代码为数组元素赋值。

静态初始化

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

以上代码定义了一个3行4列的整型数组,并将其初始化为一个3行4列的矩阵,元素的值分别是1到12。

动态初始化

int arr[3][4];
for(int i = 0; i < 3; i++){
    for(int j = 0; j < 4; j++){
        arr[i][j] = i * 4 + j + 1;
    }
}

以上代码定义了一个3行4列的整型数组,并通过循环为其赋值,元素的值分别是1到12。

二维数组的遍历

对于二维数组,我们通常需要使用嵌套循环来遍历它。其中外层循环控制行数,内层循环控制列数。

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

for(int i = 0; i < 3; i++){
    for(int j = 0; j < 4; j++){
        printf("%d ", arr[i][j]);
    }
    printf("\n");
}

以上代码遍历输出了一个3行4列的整型数组。

二维数组作为函数参数

在C语言中,将二维数组作为函数参数进行传递有两种方式:指向二维数组的指针和二维数组。使用指针作为函数参数更常见,因为指针允许数组大小动态改变。

指向二维数组的指针

void print_arr(int (*arr)[4], int row_size){
    for(int i = 0; i < row_size; i++){
        for(int j = 0; j < 4; j++){
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main(){
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    print_arr(arr, 3);
    return 0;
}

以上代码将一个二维数组作为函数参数进行传递,并打印出了数组的所有元素。

二维数组

void print_arr(int arr[][4], int row_size){
    for(int i = 0; i < row_size; i++){
        for(int j = 0; j < 4; j++){
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main(){
    int arr[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    print_arr(arr, 3);
    return 0;
}

以上代码也将一个二维数组作为函数参数进行传递,并打印出了数组的所有元素。需要注意的是,在这种方式下只能省略第一维的大小,其他维度的大小不能省略。

示例说明

示例一

假设有一个5行6列的矩阵,其每个元素都是由用户输入得到的数值,现在我们需要对这个矩阵进行求和操作。

#include <stdio.h>

int main(){
    int arr[5][6];
    int sum = 0;

    printf("请输入一个5行6列的矩阵:\n");
    for(int i = 0; i < 5; i++){
        for(int j = 0; j < 6; j++){
            scanf("%d", &arr[i][j]);
        }
    }

    for(int i = 0; i < 5; i++){
        for(int j = 0; j < 6; j++){
            sum += arr[i][j];
        }
    }

    printf("矩阵元素的和为:%d\n", sum);

    return 0;
}

以上代码通过两层嵌套的循环遍历每个元素并求和,最后输出结果。

示例二

假设有一个3行3列的矩阵,现在我们要将其中的每个元素都增加1。

#include <stdio.h>

int main(){
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    for(int i = 0; i < 3; i++){
        for(int j = 0; j < 3; j++){
            arr[i][j] += 1;
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

以上代码通过两层嵌套的循环遍历每个元素并增加1,最后输出结果。需要注意的是,由于本示例只是为了演示数组的修改操作,因此并没有使用用户输入来实现矩阵的初始化。在实际开发中,我们需要根据具体需求使用适当的方式为数组进行初始化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:从头学习C语言之二维数组 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Smart210学习记录—nand flash驱动

    Smart210学习记录—nand flash驱动 背景 在嵌入式系统开发中,存储器件是不可或缺的一部分。NAND Flash作为嵌入式系统中常见的存储器件之一,被广泛应用于设备的存储和数据传输。对于Smart210这样的开发板,NAND Flash也是其中的一部分,因此学习和掌握nand flash的驱动和使用是必要的。 nand flash的工作原理…

    其他 2023年3月28日
    00
  • java中的异步处理和Feature接口(一)

    Java中的异步处理和Feature接口(一) 什么是异步处理 Java中的异步处理是指在程序运行时,某些任务并不是在主线程中执行,而是在另外的线程中执行,以提高程序的并行处理能力和效率。 通常情况下,程序中的异步任务会在完成后通知主线程,并将处理结果返回给主线程。这样主线程就可以通过获取异步任务的结果,继续执行其他的操作,从而不会被异步任务所阻塞。 Jav…

    其他 2023年3月28日
    00
  • Win10桌面窗口管理器占用大量CPU的解决办法?

    下面就来详细讲解一下“Win10桌面窗口管理器占用大量CPU的解决办法”。 首先,需要明确的是,桌面窗口管理器 (Desktop Window Manager, DWM)是Windows操作系统下的一个重要组成部分,它负责窗口的设计和管理,使得Windows操作系统拥有了现代化的用户界面。但是,在某些情况下,DWM可能会因为某些原因占用大量CPU资源,导致电…

    other 2023年6月26日
    00
  • linux下rsync命令详细整理

    Linux下rsync命令详细整理 什么是rsync rsync是一款在Linux系统中广泛使用的数据同步工具。它可以通过网络将本地文件或者远程文件同步到远程服务器上,还可以在本地机器之间进行同步。rsync最大的特点是它可以实现增量同步,即只传输文件的差异部分,大大节约了带宽和时间。 安装rsync 在大部分的Linux发行版中,rsync都已经预安装了。…

    other 2023年6月28日
    00
  • Python面向对象的三大特性封装、继承、多态

    Python面向对象的三大特性是封装、继承和多态。这些特性是Python中面向对象编程的基础,开发者需要完全理解它们才能编写出高质量的面向对象的代码。 封装 封装是一种面向对象的编程思想,它将数据和方法封装在一个单独的类中,以保护它们免受外界的干扰。在Python中,可以通过定义类来实现封装。 下面是一个示例,展示了如何将数据和方法封装在一个类中: clas…

    other 2023年6月25日
    00
  • 华为畅享6S值得买吗?华为畅享6S全面深度评测图解

    华为畅享6S值得买吗?华为畅享6S全面深度评测图解 华为畅享6S是一款定位中端的手机。那么,这款手机是否值得购买呢?本文将从外观、性能、拍照以及其他方面对华为畅享6S进行全面深度评测,为大家进行详细介绍。 外观设计 华为畅享6S采用了6英寸的IPS全面屏,屏占比较高,给人带来不错的视觉体验。但是由于屏幕较大,单手操作时比较不方便。 机身后面是千纸鹤图案,看上…

    other 2023年6月27日
    00
  • 苹果iOS9.3.3正式版官方固件下载地址汇总

    苹果iOS9.3.3正式版官方固件下载地址汇总攻略 苹果iOS9.3.3正式版官方固件是一款用于iPhone、iPad和iPod Touch设备的操作系统。本攻略将详细介绍如何获取iOS9.3.3正式版官方固件的下载地址。 步骤一:访问苹果官方网站 首先,打开您的浏览器,并访问苹果官方网站(https://www.apple.com)。 步骤二:导航至支持页…

    other 2023年8月4日
    00
  • 使用递归算法结合数据库解析成Java树形结构的代码解析

    使用递归算法结合数据库解析成Java树形结构的代码解析,可以分为以下步骤: 步骤一:创建数据库 首先需要有一个数据库,可以使用MySQL等关系型数据库或者MongoDB等非关系型数据库。数据库中包含我们所需要的数据表,每个数据表可以对应树形结构中的一个节点。 步骤二:编写Java程序连接数据库 使用Java程序连接所创建的数据库,通过JDBC等相关工具和AP…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部