【时时三省】(C语言基础)怎样定义和引用二维数组
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
有的问题需要用二维数组来处理。例如,有3个小分队,每队有6名队员,要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组,如下图,如果建立一个数组pay,它应当是二维的,第一维用来表示第几分队,第二维用来表示第几个队员。例如用pay₂,₃表示2分队第3名队员的工资,它的值是1725。
二维数组常称为矩阵。把二维数组写成行和列的排列形式。可以有助于形象化地理解二维数组的逻辑结构。
怎样定义二维数组
怎样定义二维数组呢?其基本概念与方法和一维数组相似。
如:
float pay [ 3 ] [ 6 ];
以上定义了一个float型的二维数组,第1维有3个元素,第2维有6个元素。每一维的长度分别用一对方括号括起来。
二维数组定义的一般形式为
类型说明符数组名[常量表达式] [常量表达式];
例如:
float a [ 3 ] [ 4 ],b [ 5 ] [ 10 ];
定义a为3×4 (3行4列)的数组,b为5×10 (5行10列)的数组。注意,不能写成
float a [ 3 , 4 ],b [ 5 , 10 ];
C语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组,它的元素又是一个一维数组。
例如,可以把a看作一个一维数组,它有3个元素:
a [ 0 ],a [ 1 ],a [ 2 ]
每个元素又是一个包含4个元素的一维数组,如图:
可以把a [ 0 ],a [ 1 ],a [ 2 ]看作3个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于
float a [ 0 ] [ 4 ],a [ 1 ] [ 4 ],a [ 2 ] [ 4 ];
此处把a [ 0 ],a [ 1 ],a [ 2 ]看作一维数组名。C语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后会体会到。
C语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素。
假设数组a存放在从2000字节开始的一段内存单元中,一个元素占4个字节,前16个字节( 2000 ~ 2015 )存放序号为0的行中的4个元素,接着的16个字节( 2016 ~ 2031 )存放序号为1的行中的4个元素,余类推。
注意:
用矩阵形式(如3行4列形式)表示二维数组,是逻辑上的概念,能形象地表示出行列关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。这点务请明确。
C语言还允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。例如,定义三维数组的方法如下:float a[2][3][4] ; / /定义三维数组a,它有2页,3行,4列
多维数组元素在内存中的排列顺序为:第1维的下标变化最慢,最右边的下标变化最快。
怎样引用二维数组的元素
二维数组元素的表示形式为
数组名[下标] [下标]
例如,a [ 2 ] [ 3 ]表示a数组中序号为2的行中序号为3的列的元素。下标应是整型表达式,如a [ 2-1 ] [ 2 * 2-1 ]。不要写成a [ 2,3 ]、a [ 2-1,2 * 2-1 ]形式。
数组元素可以出现在表达式中,也可以被赋值,例如:
b [ 1 ] [ 2 ] = a [ 2 ] [ 3 ] / 2
注意:在引用数组元素时,下标值应在已定义的数组大小的范围内。在这个问题上常出现错误。例如:
int a [ 3 ] [ 4 ] ;
a [ 3 ] [ 4 ] = 3 ;/ /不存在a [ 3 ] [ 4 ]元素
按以上的定义,数组a可用的“行下标”的范围为0 ~ 2,“列下标”的范围为0 ~ 3。用a [ 3 ] [ 4 ]表示元素显然超过了数组的范围。
注意:
请读者严格区分在定义数组时用的a [ 3 ] [ 4 ]和引用元素时的a [ 3 ] [ 4 ]的区别。前者用a [ 3 ] [ 4 ]来定义数组的维数和各维的大小,后者a [ 3 ] [ 4 ]中的3和4是数组元素的下标值,a [ 3 ] [ 4 ]代表行序号为3、列序号为4的元素(行序号和列序号均从0起算)。
二维数组的初始化
可以用“初始化列表”对二维数组初始化。
( 1 )分行给二维数组赋初值。例如:
int a [ 3 ] [ 4 ] = {{1 , 2 , 3 , 4 } , {5 , 6 , 7 , 8 } , {9 , 10 , 11 , 12 } };
这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号内的数据赋给第2行的元素……即按行赋初值。
( 2 )可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。例如:
int a [ 3 ] [ 4 ] = { 1,2,3,4,5,6 , 7,8,9,10,11,12 };
效果与前相同。但以第(1)种方法为好,一行对一行,界限清楚。用第(2 )种方法如果数多,则会写成一大片,容易遗漏,也不易检查。
( 3 )可以对部分元素赋初值。例如:
int a [ 3 ] [ 4 ] = {{1},{5},{9}};
它的作用是只对各行第1列(即序号为0的列)的元素赋初值,其余元素值自动为0。赋值后数组各元素为
也可以对各行中的某一元素赋初值,例如:
int a [ 3 ] [ 4 ] = { {1},{0,6},{0,0,11} };
初始化后的数组元素如下:
这种方法对非0元素少时比较方便,不必将所有的0都写出来,只须输入少量数据,也可以只对某几行元素赋初值:
int a [ 3 ] [ 4 ] ={{1},{5,6}}
数组元素为
第3行不赋初值。也可以对第2行不赋初值。
( 4 )如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省。第3行不赋初值。也可以对第2行不赋初值,例如:
int a [ 3 ] [ 4 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 };
与下面的定义等价:
int a [ ] [ 4 ] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
系统会根据数据总个数和第2维的长度算出第1维的长度。数组一共有12个元素,每行4列,显然可以确定行数为3。
在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值。
从本节的介绍中可以看到:C语言在定义数组和表示数组元素时采用a[][]这种两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。
相关文章:

【时时三省】(C语言基础)怎样定义和引用二维数组
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 有的问题需要用二维数组来处理。例如,有3个小分队,每队有6名队员,要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组,如下图&…...
Ubuntu上安装MySQL 8并配置Navicat远程连接
1. 安装MySQL 8 sudo apt update sudo apt install mysql-server -y2. 启动MySQL服务 sudo systemctl start mysql sudo systemctl enable mysql3. 设置root密码 3.1 登录MySQL(默认无密码): sudo mysql3.2 修改root认证方式并设置密码&a…...

杨校老师竞赛课之C++备战蓝桥杯初级组省赛
目录 1. 灯塔 题目描述 输入描述 输出描述 输入样例1 输出样例1 输入样例2 输出样例2 数据说明 2. 子区间 题目描述 输入描述 输出描述 输入样例 输出样例 数据说明 3. 染色 题目描述 输入描述 输出描述 输入样例1 输出样例1 输入样例2 输出样例2 数据…...

Matlab 基于Hough变换的人眼虹膜定位方法
1、内容简介 Matlab220-基于Hough变换的人眼虹膜定位方法 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

vfrom表单设计器使用事件机制控制字段显示隐藏
1. 使用表单设计器进行debug调试 依据 vform3.0开发者文档 https://www.ganweicloud.com/docs/6.1.0/pages/d3e6d9/ 对switch组件设置事件逻辑 调试中...

【Redis篇】linux 7.6安装单机Redis7.0(参数优化详解)
💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…...

信号的概念及产生
信号的概念 信号(signal)是一种软件中断机制,用于通知进程发生了特定的事件。信号可以由系统、其他进程或进程自身发送。 在现实生活中,也有许多的信号,比如说:红绿灯、闹钟、上课铃、父母喊你回家吃饭等等…...

巧用python之--模仿PLC(PLC模拟器)
工作中用到了VM(VisionMaster4.3)有时候需要和PLC打交道,但是PLC毕竟是别人的,不方便修改别人的程序,这时候需要一个灵活的PLC模拟器是多么好呀! 先说背景: PLC型号 汇川Easy521: Modbus TCP 192.168.1.10:502 在汇川Easy521中Modbus保持寄存器D寄存器 ,在modbus协议中 0-4区…...

【计算机网络】用户从输入网址到网页显示,期间发生了什么?
1.URL解析 浏览器分解URL:https://www.example.com/page 协议:https域名:www.example.com路径:/page 2.DNS查询: 浏览器向DNS服务器发送查询请求,将域名解析为对应的IP地址。 3.CDN检查(如果有)&#…...
【计算机哲学故事1-3】默认设置:在有限的系统里,决定你想成为什么
她盯着屏幕上熟悉的蓝色窗户,语气里透着一丝无奈:“我发现,不管买多少次新电脑,开机那一刻,看到的永远是同一张桌面。” 我坐在她旁边,看着那台刚装好的电脑,笑了笑:“所以你在感慨…...
【嵌入式开发-UART】
嵌入式开发-UART ■ UART简介 ■ UART简介...

C++ 算法学习之旅:从入门到精通的秘籍
在编程的浩瀚宇宙中,C 算法宛如璀璨的星辰,照亮我们前行的道路。作为一名 C 算法小白,或许你和我一样,怀揣着对算法的好奇与憧憬,却又在学习的道路上感到迷茫。别担心,今天我就和大家分享一下如何学习各种基…...

计算机网络常识:缓存、长短连接 网络初探、URL、客户端与服务端、域名操作 tcp 三次握手 四次挥手
缓存: 缓存是对cpu,内存的一个节约:节约的是网络带宽资源 节约服务器的性能 资源的每次下载和请求都会造成服务器的一个压力 减少网络对资源拉取的延迟 这个就是浏览器缓存的一个好处 表示这个html页面的返回是不要缓存的 忽略缓存 需要每次…...

软件逆向工程核心技术:脱壳原理与实战分析
目录 一、脱壳技术概述:从保护到还原的逆向之旅 1.1 脱壳技术的本质与核心价值 1.2 壳的分类与核心技术解析 1.3 学习路径:从压缩壳到加密壳的渐进式突破 二、脱壳三步法:系统化逆向工程框架 2.1 核心流程总览 2.2 实战案例࿱…...
前端面经 作用域和作用域链
含义:JS中变量生效的区域 分类:全局作用域 或者 局部作用域 局部作用域:函数作用域 和 块级作用域ES6 全局作用域:在代码中任何地方都生效 函数中定义函数中生效,函数结束失效 块级作用域 使用let或const 声明 作用域链:JS查…...

华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录…...
【Python 字符串】
Python 中的字符串(str)是用于处理文本数据的基础类型,具有不可变性、丰富的内置方法和灵活的操作方式。以下是 Python 字符串的核心知识点: 一、基础特性 定义方式: s1 单引号字符串 s2 "双引号字符串" s…...
基础编程题目集 6-9 统计个位数字
本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。 函数接口定义: int Count_Digit ( const int N, const int D ); 其中N和D都是用户传入的参数。N的值不超过int的范围&…...
LeetCode[226] 翻转二叉树
思路: 使用递归,归根结底还是左右节点互相倒,那么肯定需要一个temp节点在中间传递,最后就是递归,没什么说的 代码: /*** Definition for a binary tree node.* public class TreeNode {* int …...

【CTFer成长之路】举足轻重的信息搜集
举足轻重的信息搜集 信息搜集 常见的搜集 题目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{info_…...
AI——认知科学中的认知架构建立步骤与方法
认知科学中的认知架构建立步骤与方法 认知架构(Cognitive Architecture)是模拟人类心智活动的计算框架,旨在整合感知、记忆、推理、学习等核心认知功能。其建立需结合心理学理论、神经科学证据和计算建模技术。以下是建立认知架构的系统方法…...

Linux开发工具【中】
目录 一、vim 1.1 插入模式 1.2 底行模式 1)set nu 2)set nonu 3) /XXX n 4)!command 5)vs other 1.3 补充 1) 批量化操作 2)批量化替换 : 3)快速定位&am…...
Ceph PG unfound/lost 问题排查与解决
Ceph PG unfound/lost 问题排查与解决 背景现象排查过程经验总结参考命令结语 背景 Ceph 集群出现 HEALTH_ERR,提示有 PG 对象丢失(unfound),并且 repair 无法自动修复。 现象 ceph health detail 显示: HEALTH_ERR …...

MySQL OCP 认证限时免费活动 7 月 31 日 前截止!!!
为庆祝 MySQL 数据库发布 30 周年,Oracle 官方推出限时福利:2025 年 4 月 20 日至 7 月 31 日期间,所有人均可免费报考 MySQL OCP(Oracle Certified Professional)认证考试。该认证验证持证者在 MySQL 数据库管理、优化…...
Python Cookbook-7.8 使用 Berkeley DB 数据库
任务 你想将一些数据做持久化处理,而且也想体验一下BerkeleyDB数据库的简洁和高效。 解决方案 如果以前在你的计算机中安装过 BerkeleyDB,Python标准库附带的bsddb包(以及可选的 bsddb3,用于访间Berkeley DBrelease 3.2数据库)可以被用来作…...
STM32智能手表:基于FreeRTOS
引言 随着物联网和可穿戴设备的快速发展,智能手表作为典型代表,集成了传感器数据采集、实时显示、无线通信等多项功能。本文将深入剖析一个基于STM32和FreeRTOS的智能手表项目,从硬件架构到软件设计,逐步讲解如何构建一个完整的嵌…...

学习笔记:数据库——事务
1.内容: 基于现有数据库设计检查点实验,观察比较提交前后执行结果并分析。 2.实现 源码 -- 开启事务 START TRANSACTION;-- 插入一条订单记录(客户ID为10002) INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);-- 获…...
C++命名空间、内联与捕获
命名空间namespace 最常见的命名空间是std,你一定非常熟悉,也就是: using namespace std;命名空间的基本格式 注意,要在头文件里面定义! namespace namespace_name{data_type function_name(data_type parameter){data_type result;//function contentreturn result;}…...

UE5 Daz头发转Blender曲线再导出ABC成为Groom
先安装Daz to Blender Import插件 【神器】 --DAZ一键导入blender插件的详细安装和使用,自带骨骼绑定和控制器,多姿势动画,Importer桥接插件_哔哩哔哩_bilibili 然后安装DAZHairConverter插件 一分钟将DAZ头发转化成Blender粒子毛发_哔哩哔…...
【进阶】C# 委托(Delegate)知识点总结归纳
1. 委托的基本概念 定义:委托是一种类型安全的函数指针,用于封装方法(静态方法或实例方法)。 核心作用:允许将方法作为参数传递,实现回调机制和事件处理。 类型安全:委托在编译时会检查方法签…...