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. COJ 2105 submatrix

    submatrix 难度级别: A: 编程语言:不限:运行时间限制:2000ms: 运行空间限制:131072KB: 代码长度限制:102400B 试题描述   小A有一个N×M的矩阵,矩阵中1~N* ...

  2. 【转】android开发中如何结束所有的activity

    原文网址:http://java--hhf.iteye.com/blog/1826880 每一个activity都有自己的生命周期,被打开了最终就要被关闭. 四种结束当前的activity方法 //关 ...

  3. 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表

    4513: [Sdoi2016]储能表 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 213[Submit][Status] ...

  4. Vim笔记

    复制多行: v 可视化,选择多行,然后yy复制.

  5. HDOJ 1214 圆桌会议

    Problem Description HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一 ...

  6. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  7. UVAlive2531 The K-League(最大流)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33451 [思路] 最大流. 大体思路是枚举每个队伍,最大流判断是否 ...

  8. 差别不在英语水平,而在汉语水平If you do not leave me, we will die together.

    为什么高考语文要提高到180分,英语降到100,差别不在英语水平,而在汉语水平.看下面例句的译法: If you do not leave me, we will die together. 你如果不 ...

  9. HDU 畅通工程系列

    畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了. 1.HDU 1863 畅通工程 题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有 ...

  10. selenium webdriver python 操作IE浏览器

    Step1:下载IEDriverServer 下载路径:http://selenium-release.storage.googleapis.com/index.html 我下载的是2.48版本的IE ...