C++Arrays

Arrays, 数组, 两个特点:

(1)fixed number of elements(固定数目的元素个数), 对于一维数组, type arrName[dimension], array 的size又称为数组的维数, 对于多维数组, 

             type arrayName[dimension1][dimension2] 的维数为dimension x dimension2, 二者的乘积也是数组元素个数。

 (2) these element must be of the same type(所有元素的类型一致)

(3)  在内存中的存储方式是sequentially(即各个元素连续的存储)

(4)通过index的方式存取(acces)数组中的各个元素。 注意C++的数组时zero-indexed, 也就是下标从0开始, 数组第一个元素的下标为0, 第二个元素下标为1.....

Array 一般在定义的时候初始化, 可以对所有的元素初始化, 或者只对一部分元素初始化。如果不初始化, 那么在程序中得到的是unexpected result. 初始化操作主要有如下几种方式:


method1:

int arr[4];

arr[0] = 6;
arr[1] = 0;
arr[2] = 9;
arr[3] = 6;
method2:

int arr[4] = {6, 0, 9, 6};

method2: 让compiler 根据我们给定的元素个数决定数组的size, 从而分配内存空间。
int arr[] = {6, 0, 9, 6, 2, 0, 1, 1};
那么我们的编译器就会create an integer array of dimension 8。

mehod3: 如果在写程序的时候无法提前知道数组元素, 需要用户输入, 以便对数组初始化, 使用如下方式初始化。

#include <iostream>
using namespace std;

int main() {
   int arr[4];
   cout << "Please enter 4 integers: " << endl;

   for (int i = 0; i < 4; i++) {
      cin >> arr[i];
   }

   cout << "values in array are now: ";

   for(int i = 0; i < 4; i++) {
      cout << " " << arr[i];
   }

   cout << endl;

   return 0;
}

输出结果为:

NOTE, 对于维度为n的数组(以一维数组为例), index的取值范围为0——n-1, 不要越界。


Array can also be passed as arguments to functions。 

在声明这样的函数的时候, 仅仅需要specify 数组作为参数即可, 不需要给出数组的dimension。 然后就可以use the array as normal within the function。

值得注意的是, 数组作为函数的参数的时候, 其实是pass by reference的(数组名记录的就是数组的内存地址, 或者说数组第一个元素的地址)。 换句话说, 如果在函数中最数组的元素做了修改, 那么在这一修改就会反映到calling scope, 一般的, 我们不希望这种情况发生, 所以在声明函数的时候在数组前加一个const修饰。 另外, 由于在函数中, 数组声明并未涉及到dimension, 所以还需要传进数组的dimension, 这是至关重要的。

#include <iostream>
using namespace std;

int sum(const int array[], const int length) {
   long sum = 0; // long int

   for (int i = 0; i < length; sum += array[i++]);  //这种对数组求和的方式很elegant.
   return sum;
}

int main() {
   int arr[] = {1, 2, 3, 4, 5, 6, 7};

   cout << "Sum: " << sum(arr, 7) << endl;// 调用的时候直接给出数组名字就可以了

   return 0;
}

运行结果为:


多维数组(multidimensional array)

多维数组的声明方式如下:

type arrayName[dimensional1][dimension2] // 二维数组的声明方式, 数组的大小为 dimensional1 X dimensional2

二维数组的第一个索引表示要存取哪一个(行) dimensional1的subarray, 第二个索引指要存取哪一列(dimensional2)的元素。 (也就是第一个索引确定选在哪一个subarray, 第二个索引决定选择这个subarray哪一个元素)。 NOTE: 索引下标均从0开始的。

初始化和存取(access)二维数组的方式和一维数组相似, 参考下面:

#include <iostream>
using namespace std;

int main() {
   int twoDimArray[2][4];

   twoDimArray[0][0] = 6;
   twoDimArray[0][1] = 0;
   twoDimArray[0][2] = 9;
   twoDimArray[0][3] = 6;

   twoDimArray[1][0] = 2;
   twoDimArray[1][1] = 0;
   twoDimArray[1][2] = 1;
   twoDimArray[1][3] = 1;

   for (int i = 0; i < 2; i++)
      for(int j = 0; j < 4; j++)
         cout << " " << twoDimArray[i][j];

   cout << endl;
   return 0;
}

运行结果如下:


不难看出, 上面的初始化方法比较verbose, 所以我们选择如下方式初始化:

int twoDimArray[2][4] = {6, 0, 9, 6, 2, 0, 1, 1};
或者如下方式初始化:

int twoDimArray[2][4] = {{6, 0, 9, 6}, {6, 0, 9, 6}};
NOTE: 多维数组初始化必须指明维度, 否则compiler 不知道如何分隔。

多维数组也可以作为函数参数, 在声明函数的时候, 必须指明除了第一维之外的所有大小, 另外为了便于处理, 一般讲第一维的大小作为另外参数传递
传递进去, 如下:

int aFunction(int arr[][4], dimensional1) {

   // code here

}


NOTE: 对于程序员来说, 多维数组仅仅是一个抽象(abstraction), 在内存空间中, 由于数组的元素市squential in memory, 所以, 宣告一个 int arr[2][4] , 和宣告一个 int arr[8], the same stuff from the memory point of view.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值