8、C++:数组


数组是一些相同类型的对象的集合,这些对象具有一定的顺序关系,在逻辑上是连续的,在内存中的存储上也是连续的。这些组成数组的对象叫做这个数组的元素。数组元素用数组名加带方括号的下标表示,比如,a[2]。数组元素具有相同的类型,可以是除void之外的任意一种类型。

数组的声明

数组跟结构体、类等一样也是自定义数据类型,所以使用以前也需要先进行声明。声明数组的时候要明确以下三点:

  1. 确定数组名称;
  2. 确定数组元素的类型;
  3. 确定数组的维数及每维的大小。
    数组的声明形式为:
数据类型 标识符[常量表达式1][常量表达式2]...;
  • 数据类型规定了数据元素的类型,可以是整型、浮点型等基本数据类型,还可以是结构体、类等自定义数据类型。
  • 标识符指定了数组的名称,记住,数组名是一个常量,代表着数组元素集合在内存存储的起始地址,不能进行自增自减运算。
  • “常量表达式1”、“常量表达式2”、…叫做下标表达式,必须是正整数。这些下标确定了数组元素的个数及每个元素在数组中的位置。一个数组可能有多个下标,下标的个数就是数组的维数,有n个下标的数组叫做n维数组。而每个下标表达式表示该维的下标个数也就是该维的元素个数。数组元素的总个数是各个下标表达式的乘积。数组每一维的下标的下界是0,上界是该下标所在维的元素个数减1。

数组的使用

数组元素的引用形式为:

数组名[下标表达式1][下标表达式2]...;
  • 这里下标表达式的个数要看数组的维数,n维数组就需要n个下标表达式。

数组的每一个元素都能看成是一个同类型的变量来使用,对整型变量的操作同样也可以用于整型数组的每个元素,对类的对象的操作也同样可用于类类型的数组的每个元素。在使用数组时要注意:

  1. 引用数组元素时的下标表达式可以是任意合法的算术表达式,但是结果必须是整型数据;
  2. 引用数组元素时的下标表达式不能超过声明数组时规定的上下界,否则会出现数组越界的问题。

数组的存储

数组在内存中是一组连续的内存单元,也就是说数组元素是连续存储的。数组名是数组所占内存的首地址。
一维数组是按照下标的顺序存储的,而对多维数组就复杂些,以一定的约定顺序将多维数组存储在连续的内存单元中很重要。因为要对数组赋初值、函数间的数组数据传递等都需要先知道数组元素和存储位置的对应关系。

  • 一维数组的元素是按照下标从小到大的顺序存在内存中的,例如,int a[3]在内存中的存储顺序是:a[0] a[1] a[2]。
  • 二维数组int a[2][3],在内存中是按行存储的,也就是先存第一行,再存第二行…。数组a在内存中的存储顺序是:a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]。
  • 对于多维数组,其存储方式与二维数组类似。可以把多维数组的下标看作一个计数器。多维数组右边的下标为低位,左边的为高位,每一位都在各自的上界与下界之间变化。

数组的初始化

在我们声明数组时对部分或全部元素赋值就是数组的初始化。

  1. 可以在声明数组时就给出每个元素的初值,例如:int a[2] = { 2,3 };如果我们在声明数组时每个元素都给出初始值的话,就可以不说明元素个数,例如:int a[] = { 2,3 };和上面的那个数组声明语句等价。
  2. 只对数组的前面一部分元素赋初值,例如,int a[3] = { 1,2 };这时数组元素的个数就必须给出,经过这样声明后,a[0]为1,a[1]为2,a[3]默认为0,也就是后面没有赋初值的元素默认为0。
  3. 多维数组的初始化也满足上面讲到的规则。
int a[2][2] = { 1,2,1,2 };
int a[][2] = { 1,2,1,2 };
int a[2][2] = { {1,2},{1,2}};

对象数组

当数组的元素是某个类的对象时此数组就是对象数组。声明一维对象数组的形式为:

类名 数组名[下标表达式];

使用对象数组也只能引用单个的数组元素,而每个数组元素都是对象,利用这个对象又可以引用它的公有成员,引用形式为:数组名[下标].成员名。

对象数组在初始化时每个对象元素都会调用其构造函数。如果初始化时数组元素显式给出初始值就会调用带形参的构造函数,如果没有显式指定初始值则调用默认构造函数。例如,A b[2] = { A(2,3) };会先调用带形参的构造函数初始化b[0],再调用默认构造函数初始化b[1]。

数组作为函数参数

函数的参数可以是数组元素也可以是数组名。数组元素作为函数参数时跟同类型的变量作函数参数效果一样。
数组名作为函数参数时,实参和形参都须是数组名,并且数组类型要一样。此时传递的是数组的首地址,也就是说形参数组的首地址跟实参是一样的,后面的元素根据其在内存中的顺序进行对应,对应的元素的内存地址相同,所以实参数组的元素个数应该等于或多于形参数组的元素个数。如果在函数内对数组元素值改变,则主调函数中实参数组的相应元素也会改变。

 #include <iostream>
using namespace std;
void RowSum(int A[][4], int nrow)
{ 
   int sum;
   for (int i = 0; i < nrow; i++)
   {
      sum = 0;
      for(int j = 0; j < 4; j++)
             sum += A[i][j];
      cout << "Sum of row " << i << " is " << sum << endl;
      A[i][0]=sum;
   }
} 
int main()
{
   int Table[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};

   for (int i = 0; i < 3; i++)
   {
       for (int j = 0; j < 4; j++)
              cout << Table[i][j] << "   ";
              cout << endl;
    }
    RowSum(Table,3);
    for (int i = 0; i < 3; i++)
         cout << Table[i][0] << endl;
    return 0;
}
  • 主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值