【时时三省】(C语言基础)怎样定义和引用二维数组

news2025/5/9 15:27:24

山不在高,有仙则名。水不在深,有龙则灵。 ----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[][]这种两个方括号的方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

杨校老师竞赛课之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检查(如果有)&#…

C++ 算法学习之旅:从入门到精通的秘籍

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

计算机网络常识:缓存、长短连接 网络初探、URL、客户端与服务端、域名操作 tcp 三次握手 四次挥手

缓存: 缓存是对cpu,内存的一个节约:节约的是网络带宽资源 节约服务器的性能 资源的每次下载和请求都会造成服务器的一个压力 减少网络对资源拉取的延迟 这个就是浏览器缓存的一个好处 表示这个html页面的返回是不要缓存的 忽略缓存 需要每次…

软件逆向工程核心技术:脱壳原理与实战分析

目录 一、脱壳技术概述:从保护到还原的逆向之旅 1.1 脱壳技术的本质与核心价值 1.2 壳的分类与核心技术解析 1.3 学习路径:从压缩壳到加密壳的渐进式突破 二、脱壳三步法:系统化逆向工程框架 2.1 核心流程总览 2.2 实战案例&#xff1…

华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录…

【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_…

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…

MySQL OCP 认证限时免费活动​ 7 月 31 日 前截止!!!

为庆祝 MySQL 数据库发布 30 周年,Oracle 官方推出限时福利:2025 年 4 月 20 日至 7 月 31 日期间,所有人均可免费报考 MySQL OCP(Oracle Certified Professional)认证考试。该认证验证持证者在 MySQL 数据库管理、优化…

学习笔记:数据库——事务

1.内容: 基于现有数据库设计检查点实验,观察比较提交前后执行结果并分析。 2.实现 源码 -- 开启事务 START TRANSACTION;-- 插入一条订单记录(客户ID为10002) INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);-- 获…

UE5 Daz头发转Blender曲线再导出ABC成为Groom

先安装Daz to Blender Import插件 【神器】 --DAZ一键导入blender插件的详细安装和使用,自带骨骼绑定和控制器,多姿势动画,Importer桥接插件_哔哩哔哩_bilibili 然后安装DAZHairConverter插件 一分钟将DAZ头发转化成Blender粒子毛发_哔哩哔…

【贪心算法】贪心算法四

贪心算法四 1.最长回文串2.增减字符串匹配3.分发饼干4.最优除法点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最长回文串 题目链接: 409. 最长回文串 题目分析: 给一个包含大小字母的字符串,从里面挑选出来一些字母构成一个…

【漫话机器学习系列】240.真正类率(True Positive Rate,TPR)

理解真正类率(True Positive Rate,TPR):公式、意义与应用 在机器学习与深度学习模型评估中,"真正类率"(True Positive Rate,简称TPR)是一个非常重要的指标。TPR反映了分类…

Linux的基础开发工具

目录 前言: 1、包管理器yum 1.1 软件包的依赖 1.2 镜像源 1.3 查找/安装/卸载软件 2、编辑器vim 2.1 命令模式(默认) 2.1.1 撤销与反撤销 2.1.2 光标定位 2.1.3 复制&&剪切(删除)&&粘贴 2.1.4 替换 2.1.5 插入模式 2.1.6 V-Block模式 …

【Electron】electron-vue 借助 element-ui UI 库助力桌面应用开发

前面文章我们讲过 electron 让可以用 HTML、JS、CSS 开发桌面应用程序。而 electron-vue 是一个结合了 electron 与 vue 的套件。这样我们就能方便地使用 vue 快速开发桌面应用。但是,vue 只是在 js 这层面做了大量的便捷的操作。对 UI 并未过多涉及。此时如果您在开…