跳到主要内容

C++ 数组

提示
  1. 数组定义:C++中的数组是一种变量,可以存储同一类型的多个值。例如,double grade[27]; 可以存储最多27个double类型的元素。
  2. 访问和初始化数组元素:C++中的数组元素与一个数字关联,称为数组索引。可以通过这些索引访问数组元素。数组也可以在声明时初始化,例如int x[6] = {19, 10, 8, 17, 9, 15};
  3. 数组边界问题:如果尝试访问数组声明的大小之外的元素,例如数组大小为10但尝试访问第11个元素,则会导致未定义行为。

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

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

double grade[27];

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

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

C++ 数组声明

dataType arrayName[arraySize];

例如,

int x[6];

这里,

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

访问 C++ 数组中的元素

在 C++ 中,数组中的每个元素都与一个数字相关联。这个数字被称为数组索引。我们可以使用这些索引来访问数组的元素。

// 访问数组元素的语法
array[index];

考虑我们上面看到的数组 x。

C++ 数组声明

需要记住的几件事:

  • 数组索引从 0 开始。意味着 x[0] 是存储在索引 0 的第一个元素。
  • 如果数组的大小为 n,则最后一个元素存储在索引 (n-1) 处。在这个例子中,x[5] 是最后一个元素。
  • 数组元素具有连续的地址。例如,假设 x[0] 的起始地址是 2120。 那么,下一个元素 x[1] 的地址将是 2124x[2] 的地址将是 2128,依此类推。 这里,每个元素的大小增加了 4。这是因为 int 的大小是 4 字节。

C++ 数组初始化

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

// 声明并初始化数组
int x[6] = {19, 10, 8, 17, 9, 15};

C++ 数组初始化

声明并初始化数组的另一种方法:

// 声明并初始化数组
int x[] = {19, 10, 8, 17, 9, 15};

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

C++ 数组中的空成员

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

例如,

// 在数组中只存储 3 个元素
int x[6] = {19, 10, 8};

这里,数组 x 的大小为 6。然而,我们只用了 3 个元素初始化它。

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

C++ 中带有空成员的数组

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

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

// 将第 4 个元素更改为 9
mark[3] = 9;

// 从用户处获取输入
// 将值存储在第三个位置
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 << "这些数字是: ";

// 打印数组元素
// 使用基于范围的 for 循环
for (const int &n : numbers) {
cout << n << " ";
}

cout << "\n这些数字是: ";

// 打印数组元素
// 使用传统的 for 循环
for (int i = 0; i < 5; ++i) {
cout << numbers[i] << " ";
}

return 0;
}

输出

这些数字是: 7 5 6 12 35
这些数字是: 7 5 6 12 35

这里,我们使用了 for 循环从 i = 0i = 4 迭代。在每次迭代中,我们打印了 numbers[i]

我们再次使用了基于范围的 for 循环来打印数组的元素。

注意: 在我们的范围 for 循环中,我们使用了 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 << "输入 5 个数字: " << endl;

// 从用户处存储输入到数组
for (int i = 0; i < 5; ++i) {
cin >> numbers[i];
}

cout << "这些数字是: ";

// 打印数组元素
for (int n = 0; n < 5; ++n) {
cout << numbers[n] << " ";
}

return 0;
}

输出

输入 5 个数字:
11
12
13
14
15
这些数字是: 11 12 13 14 15

再次,我们使用了 for 循环从 i = 0i = 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 << "这些数字是:";

// 打印数组元素
// 使用基于范围的for循环
for (const double &n : numbers) {
cout << n << " ";

// 计算总和
sum += n;

// 计算数组元素数量
++count;
}

// 打印总和
cout << "\n它们的总和 = " << sum << endl;

// 计算平均值
average = sum / count;
cout << "它们的平均值 = " << average << endl;

return 0;
}

输出

这些数字是:7 5 6 12 35 27
它们的总和 = 92
它们的平均值 = 15.3333

在这个程序中:

  1. 我们初始化了一个名为numbers的double数组,但没有指定其大小。我们还声明了三个double变量sum、count和average。

    这里,sum =0count = 0

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

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

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

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

普通的for循环要求我们指定迭代次数,由数组的大小给出。

但是基于范围的for循环不需要这样的指定。

C++数组越界

如果我们声明一个大小为10的数组,那么该数组将包含从索引09的元素。

然而,如果我们尝试访问索引10或超过10的元素,将导致未定义行为。