zoukankan      html  css  js  c++  java
  • 你好,C++(12)如何管理多个类型相同性质相同的数据?3.6 数组

    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[100000];

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

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

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

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

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

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

    知道更多:多维数组

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

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

    3.6.2  数组的使用

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

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

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

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

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

                           

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

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

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

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

  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/nihaoCPP/p/array.html
Copyright © 2011-2022 走看看