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

深入理解二维数组创建与使用

目录

一、二维数组的创建

1、二维数组的概念

数据类型层级示例:

2、二维数组的定义

定义二维数组的语法如下:

示例:

参数说明:

二、二维数组的初始化

1、不完全初始化

2、完全初始化

3、按行初始化

4、省略行数的初始化

三、二维数组的使用

1、二维数组的下标访问

示例:

2、二维数组的输入和输出

四、二维数组的内存存储

观察输出结果可以发现:

内存布局示意图:


一、二维数组的创建

1、二维数组的概念

        之前学习的数组被称为一维数组,其元素都是基本数据类型。当我们将一维数组作为数组元素时,就形成了二维数组。同理,以二维数组作为元素的数组就是三维数组。通常将二维及以上的数组统称为多维数组。

数据类型层级示例:

  • 整型(int)

  • 整型一维数组(int arr[5])

  • 整型二维数组(int arr[3][5])

2、二维数组的定义

定义二维数组的语法如下:

type arr_name[行数][列数];

示例:

int arr[3][5];      // 3行5列的整型二维数组
double data[2][8];  // 2行8列的双精度浮点型二维数组

参数说明:

  • 3 表示数组有3行

  • 5 表示每行有5个元素

  • int 指定数组元素的类型为整型

  • arr 是数组名,可自定义

  • data 数组的定义方式同理


二、二维数组的初始化

初始化是指在创建变量或数组时赋予初始值。二维数组的初始化同样使用大括号完成。

1、不完全初始化

int arr1[3][5] = {1, 2};  // 仅初始化前两个元素,其余自动设为0
int arr2[3][5] = {0};     // 所有元素初始化为0

2、完全初始化

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

3、按行初始化

int arr4[3][5] = {{1, 2},      // 第一行前两个元素初始化{3, 4},      // 第二行前两个元素初始化{5, 6}       // 第三行前两个元素初始化
};

4、省略行数的初始化

可以省略行数(第一维),但必须指定列数(第二维),编译器会根据初始值自动推断行数。

int arr5[][5] = {1, 2, 3};  // 自动推断为1行
int arr6[][5] = {1, 2, 3, 4, 5, 6, 7};  // 自动推断为2行
int arr7[][5] = {{1, 2}, {3, 4}, {5, 6}
};  // 明确3行


三、二维数组的使用

1、二维数组的下标访问

二维数组通过行和列的下标来访问特定元素。在C语言中,行和列的下标都从0开始。

示例:

int arr[3][5] = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}
};printf("%d\n", arr[2][4]);  // 访问第3行第5列的元素(值为7)

2、二维数组的输入和输出

要遍历整个二维数组,可以使用嵌套循环:外层循环控制行号,内层循环控制列号。

#include <stdio.h>int main() {int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7}};// 输入数组元素for(int i = 0; i < 3; i++) {    // 行遍历for(int j = 0; j < 5; j++) {  // 列遍历scanf("%d", &arr[i][j]);}}// 输出数组元素for(int i = 0; i < 3; i++) {    // 行遍历for(int j = 0; j < 5; j++) {  // 列遍历printf("%d ", arr[i][j]);}printf("\n");}return 0;
}


四、二维数组的内存存储

通过打印每个元素的地址,可以了解二维数组在内存中的存储方式。

#include <stdio.h>int main() {int arr[3][5] = {0};for(int i = 0; i < 3; i++) {for(int j = 0; j < 5; j++) {printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);}}return 0;
}

观察输出结果可以发现:

  1. 同一行内的元素地址连续,相邻元素地址相差4字节(int类型大小)

  2. 行末元素与下一行首元素地址也相差4字节

  3. 整个二维数组在内存中是连续存储的

内存布局示意图:

理解二维数组的内存布局对后续使用指针访问数组元素非常重要。

http://www.dtcms.com/a/328367.html

相关文章:

  • Unity TextMeshPro(二)优化
  • Redis知识点+项目+面试八股
  • 深度解读 WizTelemetry 2.0:链路追踪如何让分布式系统“无所遁形”
  • spring-cloud整合nacos详细攻略
  • 《汇编语言:基于X86处理器》第13章 高级语言接口(2)
  • 无人机在环保监测中的应用:低空经济发展的智能监测与高效治理
  • 一体化步进伺服电机在无人机舱门应用中的应用案例
  • gpt-oss-120b 模型:笔记本上的智能“奇幻之旅”
  • 什么叫渲染效果图?啥是渲染图
  • 如何将 AGV 叉车成功集成到仓库自动化系统中?
  • 智能化评估体系:数据生产、在线化与自动化的三重奏
  • ​苹果应用高版本出现:“无法安装此app,因为无法验证其完整性”是怎么回事竟然是错误的
  • 【前端Vue】如何在log-viewer组件中添加搜索定位功能
  • 基于柔性管控终端的新能源汽车充电站有序充电系统设计与实现
  • PiaRef代码库结构梳理
  • Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用(394)
  • 关于Linux编程:fread/fwrite/流的定位/文件IO
  • C++右值引用学习笔记
  • wordpress获取菜单项的ID并输出
  • FPGA+护理:跨学科发展的探索(三)
  • 解锁大模型调优新姿势:LoRA微调全解析
  • 【算法】堆(Heap)的概念、懒删除(Lazy Deletion)与堆排序(Heap Sort)
  • 【实时Linux实战系列】复杂实时系统中的需求管理
  • Qt树形控件QTreeWidget详解:构建可编辑的多级课程结构
  • Nacos-2--Nacos1.x版本的通信原理
  • Web基础
  • 力扣47:全排列Ⅱ
  • 【8】Transformers快速入门:Decoder 分支和统计语言模型区别?
  • 图解软件系统组成
  • C#控制台项目,鼠标点击后线程会暂停