当前位置: 首页 > 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.lryc.cn/news/618292.html

相关文章:

  • 使用正则中的sub实现获取我们匹配的字符串,然后追加指定字符
  • Linux图形化登录界面不显示root
  • SQL Server增加对UTF-8的支持
  • C语言(03)——斐波那契数列的理解和运用(超详细版)
  • 编程与数学 03-003 计算机操作系统 19_操作系统性能优化(二):内存与I/O性能优化
  • python3.10.6+flask+sqlite开发一个越南留学中国网站的流程与文件组织结构说明
  • 一起来聊聊GPT-5
  • PostgreSQL——数据查询
  • [GESP202309 六级] 2023年9月GESP C++六级上机题题解,附带讲解视频!
  • 後端開發技術教學(五) 魔術方法、類、序列化
  • demo 英雄热度榜 (条件筛选—高亮切换—列表渲染—日期显示)
  • Langchain入门:文本摘要
  • [论文阅读] (41)JISA24 物联网环境下基于少样本学习的攻击流量分类
  • 视频抽取关键帧算法
  • imx6ull-驱动开发篇19——linux信号量实验
  • 【跨服务器的数据自动化下载--安装公钥,免密下载】
  • n8n、Workflow实战
  • 快速了解自然语言处理
  • QT多线程全面讲解
  • NTP常见日志分析
  • MySQL User表入门教程
  • Mysql GROUP_CONCAT函数数据超长导致截取问题记录
  • 测试自动化框架全解读:为什么、类型、优势与最佳实践
  • 分布式光伏气象站:为光伏电站的 “气象感知眼”
  • 【opencv-Python学习笔记(2): 图像表示;图像通道分割;图像通道合并;图像属性】
  • 云原生应用的DevOps3(CI/CD十大安全风险、渗透场景)
  • LeetCode 2787.将一个数字表示成幂的和的方案数:经典01背包
  • 小红书笔记信息获取_实在智能RPA源码解读
  • 使用 NetBird 创建安全的私有网络,简化远程连接!
  • 完整多端口 Nginx Docker部署 + GitLab Runner注册及标签使用指南