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. zabbix 四张大表分区

    trends_uint.ibd history history_unit trends CREATE TABLE `trends` ( `itemid` bigint(20) unsigned NOT ...

  2. FSB\QPI\DMI总线的区别

    FSB\QPI\DMI总线的区别 zjdyx91                     一些客户问:intel CPU有的是前端总线(FSB),有的是QPI总线,有的又是DMI总线,这就把人弄晕了, ...

  3. HDNOIP201206施工方案

    HDNOIP201206施工方案 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 c国边防军在边境某处的阵地是由n个地堡组成的. ...

  4. Swap Nodes in Pairs——LeetCode

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  5. HDOJ(HDU) 2138 How many prime numbers(素数-快速筛选没用上、)

    Problem Description Give you a lot of positive integers, just to find out how many prime numbers the ...

  6. VMware宿主机和虚拟机的网络连接问题

    今天在win8上装了个vmware虚拟机,却发现一个vmware workstation宿主机ping不通centos虚拟机,宿主机和centos虚拟机都可以正常上网. 问题描述:今天在vmware ...

  7. ActionScript接收socket服务器发送来的数据

    原文地址:http://www.asp119.com/news/2009522181815_1.htm 从socket中接收数据的方法取决于你使用socket类型,Socket和XMLSocket都可 ...

  8. openssl生成RSA格式,并转为pkcs8格式

    原文地址:http://www.thinkingquest.net/articles/391.html?utm_source=tuicool 支付宝接口开发相关:openssl 加密工具 支付宝“手机 ...

  9. 浅谈数据库系统中的cache

    Cache和Buffer是两个不同的概念,简单的说,Cache是加速“读”,而buffer是缓冲“写”,前者解决读的问题,保存从磁盘上读出的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据.在很 ...

  10. bzoj4028: [HEOI2015]公约数数列

    Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x ...