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.

### C++ 数组的定义与使用 在C++中,数组是一种用于存储固定数量相同类型元素的数据结构[^1]。一旦声明了一个数组,则其大小不可改变。 #### 声明和初始化 可以按照如下方式来声明一个整型的一维数组: ```cpp int myArray[5]; // 定义长度为5的整形数组 ``` 也可以直接给定初始值列表来进行初始化操作: ```cpp int anotherArray[] = {10, 20, 30}; // 自动推断数组长度为3 double yetAnotherArray[4] = {1.1, 2.2, 3.3, 4.4}; ``` 对于多维数组而言,可以通过指定每一维度上的索引来创建它们;下面的例子展示如何建立二维矩阵形式的数组: ```cpp // 创建一个具有两行三列的浮点数类型的二维数组,并对其进行初始化 float matrix[2][3] = { {1.0f, 2.0f, 3.0f}, {4.0f, 5.0f, 6.0f} }; ``` #### 访问元素 通过下标访问单个元素时需要注意的是,在大多数情况下第一个位置是从`0`开始计数而不是`1`: ```cpp std::cout << "The first element is: " << myArray[0]; myArray[2] = 8; // 修改第三个元素的值 ``` 当处理动态分配内存的情况(即运行期间未知尺寸),应该考虑使用标准模板库中的向量类(`vector`)替代传统意义上的静态数组,因为前者提供了更安全的操作接口以及自动管理资源的能力。 #### 遍历数组 遍历整个一维数组的一种常见方法就是利用循环结构逐一遍历各个成员项: ```cpp for (size_t i = 0; i < sizeof(myArray)/sizeof(*myArray); ++i){ std::cout << "Element at index " << i << ": " << myArray[i]<<'\n'; } ``` 另外还可以借助于范围基迭代器简化上述过程: ```cpp #include<algorithm> ... for(auto& elem : myArray){ std::cout<<elem<<"\t"; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值