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. Java类加载的时机

    类是什么时候初始化的?类初始化的时候会执行static块,这个是我们知道的.那么我们可以用static块来做个实验. 上面代码输出是: hello worldinitthis is a test这说明 ...

  2. open和fopen的区别(转)

    转载自:http://www.cnblogs.com/joeblackzqq/archive/2011/04/11/2013010.html open和fopen的区别: 1.缓冲文件系统缓 冲文件系 ...

  3. Pearls DP

    Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6647   Accepted: 3241 Description In Pe ...

  4. Light OJ 1005 - Rooks(DP)

    题目大意: 给你一个N和K要求确定有多少种放法,使得没有两个车在一条线上. N*N的矩阵, 有K个棋子. 题目分析: 我是用DP来写的,关于子结构的考虑是这样的. 假设第n*n的矩阵放k个棋子那么,这 ...

  5. Manacher Ural 1297 Palindrome

    1297. Palindrome Time limit: 1.0 secondMemory limit: 64 MB The “U.S. Robots” HQ has just received a ...

  6. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  7. Ancient Message (古埃及象形文字识别 Uva 1103)

    原题:https://uva.onlinejudge.org/external/11/1103.pdf 给一幅图(16进制), 判断图中有哪些象形文字. 只识别 这6个就可以 示例: 将16进制数据 ...

  8. lightoj 1005 组合数学

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1005 #include <cstdio> #include <cst ...

  9. springMVC整合jedis+redis

    http://www.cnblogs.com/zhengbn/p/4140549.html 前两天写过 springMVC+memcached 的整合,我从这个基础上改造一下,把redis和sprin ...

  10. Android自动化测试之monkeyrunner工具

    一.什么是monkeyrunner monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monkeyrunner,您可以 ...