C++ 数组使用指南

在本教程中,我们将学习使用数组。我们将借助示例学习在 C++ 编程中声明、初始化和访问数组元素。

在 C++ 中,数组是一个变量,可以存储多个相同类型的值。例如,

假设一个班级有 27 名学生,我们需要存储所有学生的成绩。我们可以简单地创建一个数组,而不是创建 27 个单独的变量:

double grade[27];

这里, grade 是一个数组,最多可以容纳 27 个 double 类型的元素。

在 C++ 中,数组的大小和类型在声明后不能更改。

C++ 数组声明

下面展示了 C++ 声明数组变量的语法:

dataType arrayName[arraySize];

例如,

int x[6];

这里,

  • int - 要存储的元素类型
  • x - 数组名称
  • 6 - 数组的大小

访问 C++ 数组中的元素

在 C++ 中,数组中的每个元素都有一个位置索引。我们可以通过使用这些索引来访问数组的元素。

array[index];

下图展示了上面声明的 x 数组的索引

C++ 数组声明
C++中数组的元素

要记住的几件事:

  • 数组索引从 0 开始。 x[0] 是存储在数组中的第一个元素 0

  • 如果数组的大小为 n,则最后一个元素存储在索引 (n-1) 处。在这个例子中,x[5] 是最后一个元素。

  • 数组的元素具有连续的地址。例如,假设 x[0] 的起始地址是 2120d。然后,下一个元素 x[1] 的地址将是 2124dx[2] 的地址将是 2128d,依此类推。

    这里,每个数组元素的地址比前一个增加了 4。这是因为 的 int 大小是 4 个字节。

C++ 数组初始化

在 C++ 中,可以在声明期间初始化数组。例如,

int x[6] = {19, 10, 8, 17, 9, 15};

C++ 数组初始化
C++ 数组元素及其数据

在声明期间初始化数组时可以不指定数组的大小:

int x[] = {19, 10, 8, 17, 9, 15};

在这里,我们没有指定数组的大小。在这种情况下,编译器会自动计算大小。

具有空成员的 C++ 数组

在 C++ 中,如果一个数组的大小是 n,我们最多可以在数据中存储 n 个元素。但是,如果我们存储的数量少于 n 元素的数量。

例如,

int x[6] = {19, 10, 8};

这里,数组 x 大小为 6。 但是,我们仅使用 3 个元素对其进行了初始化。

在这种情况下,编译器会为其余位置分配随机值。通常,这个随机值为 0

具有空成员的 C++ 数组
具有空成员的 C++ 数组

如何插入和打印数组元素?

假设我们有如下的数组:

int mark[5] = {19, 10, 8, 17, 9}

下面展示了对数组元素的几种常用的操作:

  • 将第 4 个元素改为 9

    mark[3] = 9;
    
  • 将用户的输入存储在数字的第 3 个元素中

    cin >> mark[2];
    
  • 将用户的输入存在第 i 个元素中

    cin >> mark[i-1];
    
  • 打印数组的第一个元素

    cout << mark[0];
    
  • 打印数组的第 i 个元素

    cout >> mark[i-1];
    

示例 1:显示数组元素

#include <iostream>
using namespace std;

int main() {
    int numbers[5] = {7, 5, 6, 12, 35};

    cout << "The numbers are: ";

    // 基于索引的打印
    for (int i = 0; i < 5; ++i) {
        cout << numbers[i] << "  ";
    }

    cout << "\nThe numbers are: ";

    // 基于范围的打印
    for (const int &n : numbers) {
        cout << n << "  ";
    }

    return 0;
}

输出

The numbers are: 7 5 6 12 35
The numbers are: 7 5 6 12 35

在这里,我们先使用了一个 for 循环i = 0i = 4 进行迭代。在每次迭代中,我们都打印了 numbers[i] .

我们再次使用基于范围的 for 循环来打印出数组的元素。要了解有关此循环的更多信息,请查看C++ Ranged for Loop

**注意:**在我们基于范围的循环中,我们使用了代码 const int &n 而不是 int n 作为范围声明。但是, const int &n 更优选,因为:

  1. 使用 int n,在每次迭代中只是简单地将数组元素复制到变量 n 。这不是内存有效的。

    但是, &n会使用数组元素的内存地址来访问它们的数据,而无需将它们复制到新变量中。这是内存有效的。

  2. 我们只是打印数组元素,而不是修改它们。因此,我们使用 const 以免意外更改数组的值。

示例 2:从用户获取输入并将它们存储在数组中

#include <iostream>
using namespace std;

int main() {
    int numbers[5];

    cout << "Enter 5 numbers: " << endl;

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

    cout << "The numbers are: ";

    for (int n = 0; n < 5; ++n) {
        cout << numbers[n] << "  ";
    }

    return 0;
}

输出

Enter 5 numbers: 11 12 13 14 15
The numbers are: 11 12 13 14 15

这里,我们使用 for 循环从 i = 0 到迭代 i = 4 。在每次迭代中,我们从用户那里获取输入并将其存储在 numbers[i] .

然后,我们使用另一个 for 循环来打印所有数组元素。

示例 3:使用 for 循环显示数组元素的总和和平均值

#include <iostream>
using namespace std;

int main() {

    double numbers[] = {7, 5, 6, 12, 35, 27};

    double sum = 0;
    double count = 0;
    double average;

    cout << "The numbers are: ";

    for (const double &n : numbers) {
        cout << n << "  ";

        //  计算综合
        sum += n;

        // 计算数量
        ++count;
    }

    // 打印综合
    cout << "\nTheir Sum = " << sum << endl;

    // 计算平均数并打印
    average = sum / count;
    cout << "Their Average = " << average << endl;

    return 0;
}

输出

The numbers are: 7 5 6 12 35 27
Their Sum = 92
Their Average = 15.3333

在这个程序中:

  1. 我们初始化了一个 double 数组并命名为 number, 但没有指定其大小。我们还声明了三个double 变量 sum, countaverage

    这里, sum =0count = 0

  2. 然后我们使用基于范围的 for 循环来打印数组元素。在循环的每次迭代中,我们将当前数组元素累加到 sum.

  3. 我们还在每次迭代中为 count 增加了 1,以便我们可以在 for 循环结束时获得数组的大小。

  4. 打印完所有元素后,我们打印所有数字的总和和平均值。数字的平均值由 average = sum / count; 计算得出。

**注意:**我们使用了基于范围的 for 循环而不是普通 for 循环。

普通 for 循环要求我们指定迭代次数,该次数由数组的大小给出。但是远程 for 循环不需要知道数组的大小。

C++ 数组越界

如果我们声明一个大小为 10 的数组,那么该数组将包含从索引 09 的元素。但是,如果我们尝试访问索引为 10 或超过 10 的元素,则会导致未定义行为。

结论

在本教程中,我们学习了 C++ 变成语言中的数组以及各种用法。

  • C++ 数组是是可以存储多个值的容器。
  • 声明数组需要指定数组的大小,但是在声明时直接初始化则不需要指定大小。
  • 数组元素可以直接通过索引进行访问。数组的索引从 0 开始。
  • C++ 数组可以使用基于索引的 for 循环或者基于范围的 for 循环进行遍历。