3.6  数组

学过前面的基本数据类型之后,我们现在可以定义单个变量来表示单个的数据。例如,我们可以用int类型定义变量来表示公交车的216路;可以用float类型定义变量来表示西红柿3.5元一斤。但是,除了单个孤立的数据之外,现实世界中还有一类批量数据。例如,一个公司所有员工的工资,这些数据的数据类型相同(都是int类型),性质相同(都表示员工的工资),数量很多(成千上万员工的工资),并且往往形成一个有意义的数据集合(员工工资)。针对这类的批量数据,单独地定义一个一个的变量来表示显然是行不通的。为此,C++提供了数组这种构造型数据类型来表达批量数据,它将这些数据组织起来形成一个数据序列,让这些数据排排坐,吃果果,极大地方便了批量数据的处理。

3.6.1  数组的声明与初始化

在C++中,定义一个数组的方法同定义一个变量的方式非常相似,不同的是,变量名变成了数组名,而在数组名之后,我们用中括号“[]”引出了表示数组中数据元素个数的常数。其具体语法形式如下:

数据类型 数组名[个数常量][个数常量]…;

其中,数据类型表示这一系列批量数据的类型。比如,我们要定义一个可以保存多位员工工资的数组,而每个员工工资数据都可以用int类型数据表示,那么整个数组的数据类型就是int类型;数组名通常是一个表明数组中数据含义的标识符。在这里,数组中的数据都是员工工资,所以我们可以用arrSalary作为数组名。其中,arr表示这是一个数组(array),而Salary则表示数组中的数据都是工资;数组名后中括号中的个数常量则表示这一系列批量数据的个数。比如,这个公司有100000位员工,我们需要在数组中保存100000个工资数据,那么这个个数常量自然就是100000。另外需要注意的是,这个个数常量必须大于0,并且必须是常数。根据上面的分析,我们可以这样来定义用以保存100000个员工工资数据的数组:

// 保存100000个员工工资的数组
int arrSalary[];

在定义数组的同时,也可以利用“{}”对数组进行初始化。例如:

// 定义数组并进行初始化
int nArray[] = { ,,,, };

这行代码在定义一个长度为5的整型数组nArray的同时,用“{}”把1、2、3、4、5分别赋值给数组中的5个元素,以此来完成数组的初始化。当然,如果不需要对数组中的所有数据都赋初始值,也可以仅对数组的前面部分元素赋值,而剩余的未指定初始值的数据,会被赋值为0或是这种数据的默认初始值。例如:

// 给定数组中前6个元素的初始值,剩下94个数据被赋值为0
int nBigArray[] = { -, , , , , };

虽然我们可以利用“{}”在定义数组的同时对数组元素赋初始值,可是数组的数据元素往往较多,要想使用“{}”完成其中所有数据的赋值,往往是不太现实的。更多的时候,我们是利用“{}”将数组中的所有元素都赋值为0,完成数组使用前的清零操作。例如:

// 将nBigArray数组中的所有元素赋值为0
int nBigArray[] = { };

知道更多:多维数组

数组定义中的中括号“[ ]”用于确定数组的维数。在数组名后有几个“[ ]”就表示这是一个几维数组,而一个数组的维数,往往代表了其中数据的分类次数。比如,我们要表示一个学校所有学生的成绩,我们往往先把所有学生成绩按照年级分成三个年级,然后每个年级又可以按照班级分成10个班级,而每个班级又有30名学生。这样,经过三次分类,我们就可以用一个三维数组来保存一个学校所有学生的成绩:

// 记录学生成绩三维数组
int arrScore[][][];

3.6.2  数组的使用

定义好数组后,我们就相当于拥有了多个变量,可以引用数组中的数据元素来进行运算。要想访问数组中的各个数据,我们通过在数组名后的中括号中给定数组下标来实现。所谓数组下标,它代表了要访问的数据在数组中的位置。要注意的是,这个表示数据位置的下标是从0开始记数的。比如,在我们前面定义的记录员工工资的arrSalary数组中,第一个数据是老板的工资,我们就可以通过如下的方式来读写访问第一个数据:

// 数组中第一个数据表示老板的工资,用下标0表示数组的第一个数据
// 赋值为1,表示老板的工资为1
arrSalary[] = ;
// 读取数组中的第一个数据,输出老板的工资
cout<<"老板的工资是:"<<arrSalary[]<<endl;

这里我们可以看到,通过在数组名之后的中括号中给定0这个下标,我们可以像读写普通变量一样地来读写数组中的第一个数据。以此类推,要想访问数组中的第二个数据,数组下标就应该是1,要想访问第n个数据,下标就应该是n-1。例如:

// 数组中的第二个数据表示老板娘的工资, 给定下标1访问
arrSalary[] = ;
// 往后依次就是各个员工的工资
arrSalary[] = ;
// …

在使用数组下标时,另外需要注意的一个地方是,下标必须大于等于0小于数组定义时的个数常数。简单来讲,一个长度为n的数组,其下标的取值范围是[0,n-1]。如果下标的取值超出了这个范围,就会访问到数组以外的内存区域,引起数组访问越界的错误,轻则造成数据读写错误,严重时甚至会导致程序崩溃。并且,这种错误极具隐蔽性,往往很难发现。所以我们一开始在使用数组时,就一定要时刻注意防止数组访问越界。数组下标与数组中数据元素的对应关系如下图所示:

图3-3 数组中数据元素与下标的对应关系

同样的道理,对于二维数组、三维数组等多维数组,同样可以通过给定多个下标来访问数组中的数据元素。例如:

// 第一个年级,第二个班级,第26位同学的成绩是82
arrScore[][][] = ;

这里我们可以看到,通过下标对数组中元素进行读写访问,就像使用一个单独的变量一样简单。有了数组的帮忙,我们在描述大量性质相同的数据时,就无须单独地定义多个相同类型的变量,而只需定义一个能容纳需要处理数据的数组,然后通过不同的下标就可以访问到不同的数据,也就像拥有多个单独变量一样方便。

你好,C++(12)如何管理多个类型相同性质相同的数据?3.6 数组的更多相关文章

  1. 你好,C++(12)怎样管理多个类型同样性质同样的数据?3.6 数组

    3.6  数组 学过前面的基本数据类型之后,我们如今能够定义单个变量来表示单个的数据.比如,我们能够用int类型定义变量来表示公交车的216路:能够用float类型定义变量来表示西红柿3.5元一斤. ...

  2. Linux 0.12 内核管理存储器

    Linux 0.12 内核管理存储器 其分段,用分段的机制把进程间的虚拟地址分隔开. 每一个进程都有一张段表LDT.整个系统有一张GDT表.且整个系统仅仅有一个总页表. 其地址翻译过程为: 程序中给出 ...

  3. 使用Atlas进行元数据管理之Type(类型)

    背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索, 在接下来的系列文章中, 会陆续与读者们进行分享在此过程中踩过的坑和收获. 元数据管理系列文章: [0] - 使用Atlas进行元数据 ...

  4. Golang高阶:Golang1.5到Golang1.12包管理

    Golang1.5到Golang1.12包管理 1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时候算是正式推出了,然后到最近的一两年,2017-2018年的时候,突然直线上 ...

  5. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  6. 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;

    http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...

  7. 企业级容器管理平台 Rancher 介绍入门及如何备份数据

    企业级容器管理平台 Rancher 介绍入门及如何备份数据 是什么 Rancher 是一个为 DevOps 团队提供的完整的 Kubernetes 与容器管理解决方案的开源的企业级容器管理平台.它解决 ...

  8. /Array.CreateInstance创建类型为int,长度为5的数组

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  9. Linux-3.14.12内存管理笔记【伙伴管理算法(1)】

    前面分析了memblock算法.内核页表的建立.内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征.而start_kernel()接下来的 ...

随机推荐

  1. Linux 统计文件夹下文件个数

    查看统计当前目录下文件的个数,包括子目录里的. ls -lR| grep "^-" | wc -l Linux下查看某个目录下的文件.或文件夹个数用到3个命令:ls列目录.用gre ...

  2. 【HDOJ】2371 Decode the Strings

    快速矩阵乘法.注意,原始字符串即为decode后的字符串.题目是要找到原始串. #include <cstdio> #include <cstring> #define MAX ...

  3. Unity 动态载入Panel并实现淡入淡出

    unity版本:4.5 NGUI版本:3.6.5 参考链接:http://tieba.baidu.com/p/3206366700,作者:百度贴吧 水岸上 动态载入NGUI控件,这里用Panel为例说 ...

  4. 【转】Android的onCreateOptionsMenu()创建菜单Menu详解

    原文网址:http://www.linuxidc.com/Linux/2012-02/55500.htm Android一共有三种形式的菜单:            1.选项菜单(optinosMen ...

  5. datetime和timer的使用(小小幻灯片)

    一:展示图片 每秒换一次图片,一共六十张图片,00-59 二:代码 a,设计代码 namespace timePicture { partial class Form1 { /// <summa ...

  6. VS插件 热

    1. AnkhSVN - Subversion SCC Providerhttp://ankhsvn.open.collab.net/ AnkhSVN是一个VS的Subversion 源代码管理提供者 ...

  7. HDOJ 2056 Rectangles

    Problem Description Given two rectangles and the coordinates of two points on the diagonals of each ...

  8. Listview加载更多是,恢复到原来的位置,如果不加特殊处理,总是跳转第一条

    1.记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复 listView.setOnScrollListener(new OnScrollListener ...

  9. python操作RabbiMQ

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  10. hdoj 1728 逃离迷宫

    逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...