Tutorial Study Image

C++ 中的数组


2022 年 8 月 27 日, Learn eTutorial
1855

在本教程中,您将学习有关称为数组数据结构的所有内容。借助简单的示例,您将了解如何声明、初始化和访问数组中的变量。

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

例如,

假设一个班级有 29 名学生,我们需要保存他们的成绩。与其创建 29 个单独的变量,我们不如简单地创建一个数组。


double grade[29];
 

在上面的示例中,“grade”是一个最大容量为 29 个双精度类型元素的数组。

C++ 中的数组在声明后不能更改。

你说的数组是什么意思?

  • 它是由单个元素引用的一组具有相似数据类型的变量。
  • 它的组件存储在一个连续的内存位置。
  • 数组的大小应在声明时指定。
  • 数组元素始终从零 (0) 开始计数。
  • 数组元素在数组中的位置可用于访问它。
  • 数组可以有一个或多个维度。

C/C++ 或任何其他编程语言中,数组是存储在相邻内存位置的一组相关数据项,其元素可以使用数组的索引随机访问。它们可用于存储任何类型的基本数据类型,例如 int、float、double、char 等。此外,在 C/C++ 中,数组主要用于存储派生数据类型,例如结构体、指针等。

数组的图示如下。
 

Arrays in C++

如何在 C++ 中声明数组?

定义数组的一般语法如下:

dataType arrayName[arraySize];

请看下面的示例

int x[6];

在上面的例子中

  • int = 它指将要存储的元素类型。
  • x = 它指数组的名称
  • 6 = 它指数组大小

在这种情况下,数组 x[6] 在内存中创建六个相邻的单元格,即 x[0]、x[1]、sal[2]、x[3]、x[4]x[5],用于存储 int 类型的值。

数组的分配从“null”开始,因此该系列的最后一个变量将存储在 x[size -1] 中。在我们的示例中,数组的第一个元素将分配给 x[0],最后一个元素将分配给 x[5]

如何在 C++ 中访问数组元素?

在 C++ 中,数组中的每个元素都被分配一个数字。该数字被称为数组索引。使用这些索引,我们可以访问数组元素。

访问数组元素的语法

array[index];
Arrays in C++

此图显示了 C++ 数组的元素

请记住以下几点

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

C++ 中的数组初始化

数组初始化是为数组元素赋值的过程。数组元素在使用前必须初始化。如果未正确初始化,程序将产生意外结果。让我们通过示例了解数组如何初始化。

C++ 中可以在声明时初始化数组

例如:让我们声明并初始化一个数组

int x[6] = {10, 20, 30, 40, 50, 60};
Arrays in C++

此图显示了 C++ 数组元素及其数据

在声明数组时初始化数组的另一种方法

int x[] = {10, 20, 30, 40, 50, 60};

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

我们可以在声明后初始化数组。让我们举个例子

int x[3];
x[0] = 10;
x[1] = 20;
x[2] = 30;

C++ 中包含空成员的数组

没有成员的数组表示空成员。在 C++ 中,如果一个数组的大小为 n,我们最多可以存储 n 个元素。然而,在 C++ 中,如果我们存储的元素少于 n 个,会发生什么?

例如


//let us store only 3 elements in the array
int x[6] = {10, 20, 30};

在这种情况下,数组 x 的大小为 6。但是,我们最初只给了它三个元素。

在这种情况下,编译器会为剩余位置分配随机值。通常,这个随机值只是 0。空数组成员会自动分配 0。

An array With Empty Members in C++

在 C++ 中显示数组元素

我们利用 cout 函数,在循环的帮助下,使用索引打印从数组中访问的值。

示例 1:如何使用 for 循环打印数组元素。


#include 
using namespace std;

int main() {

  int numbers[5] = {10, 20, 30, 40, 50};

  cout << "The numbers : ";

  //  Printing the array elements
  // using the range based for loop
    for (int i = 0; i < 5; ++i) {
    cout << numbers[i] << "  ";
  }

  return 0;
}

输出

The numbers : 10  20  30  40  50 

在此示例中,for 循环用于从 i = 0 迭代到 i = 4。我们在每次迭代中都打印了 numbers[i]。

让我们讨论如何使用基于范围的循环显示数组元素

示例 1:如何使用 for 循环打印数组元素。


#include 
using namespace std;

int main() {

  int numbers[5] = {10, 20, 30, 40, 50};

  cout << "The numbers : ";

  //  Printing the array elements
  // using the range based for loop
  for (const int &n : numbers) {
    cout << n << "  ";
  }

  return 0;
}

输出

The numbers : 10  20  30  40  50 

在我们的基于范围的循环中,我们使用 const int &n 作为范围声明,而不是 int n。然而,const int &n 更受青睐,因为

  • 每次迭代的 int n 只是将数组元素复制到变量 n。这在内存使用方面效率不高。
  • 另一方面,&n 使用数组元素的内存地址来访问其数据,而无需将其复制到新变量。这节省了内存。
  • 我们只是打印数组元素,而不是更改它们。因此,我们使用 const 来避免意外更改数组的值。

要了解有关此范围循环的更多信息,请查看 C++ 范围 for 循环

如何在 C++ 中插入数组元素?

cin 函数和循环的帮助下,我们可以向数组输入值。

让我们编写一个 C++ 程序,它将从用户那里获取输入并存储在数组中。


#include <iostream>
using namespace std;

int main() {

  int numbers[5];

  cout << " please enter 5 numbers: " << endl;

  //  store the  input from user to an array
  for (int i = 0; i < 5; ++i) {
    cin >> numbers[i];
  }

  cout << " So the numbers are: ";

  //  print the array elements
  for (int n = 0; n < 5; ++n) {
    cout << numbers[n] << "  ";
  }

  return 0;
}

输出

please enter 5 numbers: 
11
12
17
18
19
So the numbers are: 11  12  17  18  19  

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

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

使用 for 循环,在 C++ 中显示数组元素的和与平均值

#include <iostream>
using namespace std;

int main() {
    
  // first initialize an array without specifying its  size
  double numbers[] = {7, 15, 16, 12, 35, 2};

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

  cout << "So the numbers are: ";

  //  print the array elements
  // here, use of range-based for loop
  for (const double &n : numbers) {
    cout << n << "  ";

    //  calculate the sum
    sum += n;

    // count the number of the array elements
    ++count;
  }

  // print the sum
  cout << "\nTheir Sum = " << sum << endl;

  // find the average
  average = sum / count;
  cout << "Their Average = " << average << endl;

  return 0;
}

输出

So the numbers are: 7  15  16  12  35  2  
Their Sum = 87
Their Average = 14.5

在程序中

  • 我们创建了一个名为 numbers 的双精度数组,但未指定其大小。此外,还声明了三个双精度变量:sumcountaverage
  • 在这种情况下,sum = 0 count = 0
  • 然后使用基于范围的 for 循环打印数组元素。在每次循环迭代中,我们将当前数组元素添加到 sum 中。
  • 为了在 for 循环结束时知道数组的大小,我们还会在每次迭代中将 count 的值增加 1。
  • 在打印所有元素之后,我们打印所有数字的总和和平均值。Average = sum / count 给出数字的平均值。

注意

在这个程序中,使用了基于范围的 for 循环代替了普通 for 循环

普通for 循环的迭代次数由数组大小决定,必须指定。

另一方面,基于范围的 for 循环不需要此类规范。

C++ 中的数组越界是什么意思?

如果我们声明一个包含 10 个元素的数组,则该数组将包含从 0 到 9 的元素。
但是,尝试访问索引 10 或更高的元素将导致未定义行为。这就是 C++ 中的数组越界。

我们为什么需要数组?

当我们有少量对象时,可以使用普通变量(v1、v2、v3 等),但是当有大量实例时,使用普通变量管理它们会变得非常困难。因此,使用数组的主要思想是在单个变量中表示多个实例。

Arrays in C++

数组的优点

  • 代码优化以及随机访问是数组的主要优点。
  • 代码优化:我们可以有效地检索或排序数据。
  • 随机访问:我们可以检索位于索引位置的任何数据。

缺点

  • 数组的大小限制是数组的主要缺点
  • 大小限制:数组只能存储固定大小的元素。它在运行时不会扩大大小。

要练习更多数组程序,请参阅我们的示例程序