C++ 中的数组 | 声明 | 初始化 | 指向数组的指针示例

什么是数组?

数组是一种按顺序存储相同数据类型元素的结构。C++ 数组的大小是固定的。

您可以将数组视为一组相同数据类型的变量。您无需单独声明每个变量并为其赋值,而是可以声明一个变量(数组),并将各种变量的值添加到其中。添加到数组中的每个值都通过索引进行标识。

为什么我们需要数组?

数组在任何编程语言中都非常重要。它们提供了一种更便捷的方式来存储变量或相同数据类型的集合,而不是将它们分开存储。数组中的每个值都可以单独访问。

在 C++ 中声明数组

C++ 中的数组声明涉及指定数组要存储的元素类型以及元素的数量。语法

type array-Name [ array-Size ];

声明 C++ 中一维数组的规则。

  • 类型:类型是要存储在数组中的元素的类型,它必须是有效的 C++ 数据类型。
  • 数组名:数组名是要分配给数组的名称。
  • 数组大小:数组大小是要存储在数组中的元素数量。它必须是大于 0 的整数。

例如,您可以创建一个名为 age 的数组,并按以下方式存储 5 个学生的年龄:

int age[5];

数组 age 将存储 5 个整数,代表不同学生的年龄。

数组初始化

数组初始化是将元素分配/存储到数组的过程。初始化可以一次性完成,也可以逐个完成。请注意,数组中的第一个元素存储在索引 0 处,而最后一个元素存储在索引 n-1 处,其中 n 是数组中元素的总数。

在 age 数组的情况下,第一个元素将存储在索引 0 处,而最后一个元素将存储在索引 4 处。

让我们使用 age 数组来演示数组初始化可以如何完成:

int age[5] = {19, 18, 21, 20, 17};

花括号 {} 中的元素总数不能超过方括号 [] 中指定的数值。元素 19 位于索引 0,18 位于索引 1,21 位于索引 2,20 位于索引 3,17 位于索引 4。如果您没有在方括号 [] 中指定要存储在数组中的元素数量,数组的大小将恰好可以容纳花括号 {} 中添加的元素。例如:

int age[] = {19, 18, 21, 20, 17};

上面的语句将创建与前面的语句完全相同的数组。您也可以使用索引为数组分配一个元素。例如:

age[3] = 20;

上面的语句会将值 20 存储在名为 age 的数组的索引 3 处。这意味着 20 将是数组的第 4 个元素。

数组类型

C++ 数组有两种类型:

  • 一维数组
  • 多维数组
  • 指向数组的指针

一维数组

这是一种数据项仅在一个维度上线性排列的数组。通常称为一维数组。语法

datatype array-name[size];
  • 数组名是数组的名称。
  • 大小是要存储在数组中的项目数量。

例如

#include <iostream>
using namespace std;

int main()
{
	int age[5] = { 19, 18, 21, 20, 17 };
	for (int x = 0; x < 5; x++)
	{
		cout <<age[x]<<"\n";
	}
}

输出

One-Dimensional Array

这是代码的屏幕截图:

One-Dimensional Array

代码解释

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包含 std 命名空间,以便使用其类和函数而无需调用它们。
  3. 调用 main() 函数,程序的逻辑应添加到其中。
  4. main() 函数体的开始。
  5. 声明一个名为 age 的数组来存储 5 个整数。这 5 个整数也已初始化。
  6. 使用 for 循环创建一个整数变量 x。
  7. for 循环体的开始。
  8. 使用循环变量 x 遍历数组 age 的值,并在控制台上打印它们。“\n”是换行符,每次迭代后都会在新行中打印。
  9. for 循环体的结束。
  10. main() 函数体结束。

多维数组

这是一种数据项排列成数组之数组的数组。多维数组可以有任意数量的维度,但二维和三维数组很常见。语法

datatype array-name[d1][d2][d3]...[dn];

数组名是具有 n 个维度的数组的名称。例如:

二维数组

二维数组以一维数组列表的形式存储数据。它是一个具有行和列的矩阵。要声明二维数组,请使用以下语法:

type array-Name [ x ][ y ];

类型必须是有效的 C++ 数据类型。将二维数组视为一个表,其中 x 表示行数,y 表示列数。这意味着您可以使用 a[x][y] 的形式来标识二维数组中的每个元素,其中 x 是行数,y 是元素所属的列数。

以下是如何初始化二维数组的示例:

int a[2][3] = {  
   {0, 2, 1} ,   /*  row at index 0 */
   {4, 3, 7} ,   /*  row at index 1 */
   };

在上面的示例中,我们有一个二维数组,可以看作是一个 2x3 的矩阵。有 2 行 3 列。元素 0 可以作为 a[0][1] 访问,因为它位于索引为 0 的行和索引为 1 的列的交叉处。元素 3 可以作为 a[1][2] 访问,因为它位于索引为 1 的行和索引为 2 的列的交叉处。

请注意,我们仅添加了花括号来区分不同的元素行。初始化也可以如下进行:

int a[2][3] = {0, 2, 1, 4, 3, 7};
   };

以下 C++ 示例演示了如何初始化和遍历二维数组:

#include <iostream>
using namespace std;
int main() 
{
	// a 2x3 array
	int a[3][2] = { {0, 2}, {1, 4}, {3, 7} };

	// traverse array elements

	for (int i=0; i<3; i++)
		for (int j=0; j<2; j++) 
		
		{
			cout << "a[" <<i<< "][" <<j<< "]: ";
			cout << a[i][j] << endl;
		}
	return 0;
}

输出

Two Dimensional Array

这是上述代码的屏幕截图:

Two Dimensional Array

代码解释

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包含 std 命名空间,以便使用其类和函数而无需调用它们。
  3. 调用 main() 函数,代码应添加在其中。
  4. main() 函数体的开始。
  5. 注释。C++ 编译器将忽略此项。
  6. 声明一个 3 行 2 列的二维数组。数组中也已添加了元素。
  7. 注释。C++ 编译器将忽略此项。
  8. 创建一个变量 i,使用 for 循环。此变量将遍历数组的行索引。
  9. 创建一个变量 j,使用 for 循环。此变量将遍历数组的列索引。
  10. 循环体的开始。
  11. 在控制台上打印变量 i 和 j 的值,用方括号括起来。
  12. 打印数组 a 中索引 [i][j] 处存储的值。
  13. 循环体的结束。
  14. 如果程序运行正常,main() 函数应返回一个整数值。
  15. main() 函数体结束。

三维数组

三维数组是数组的数组。三维数组中的每个元素都由一组 3 个索引标识。要访问三维数组的元素,我们需要使用三个 for 循环。例如:

#include<iostream>
using namespace std;
void main()
{
	int a[2][3][2] = {{{4, 8},{2, 4},{1, 6}}, {{3, 6},{5, 4},{9, 3}}};
	cout << "a[0][1][0] = " << a[0][1][0] << "\n";
	cout << "a[0][1][1] = " << a[0][1][1] << "\n";
}

输出

Three –Dimensional Array

这是代码的屏幕截图:

Three –Dimensional Array

代码解释

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包含 std 命名空间,以便使用其类和函数而无需调用它们。
  3. 调用 main() 函数,程序的逻辑应添加到其中。
  4. main() 函数体的开始。
  5. 声明一个大小为 2x3x2 的三维数组 an。数组的值也已初始化。
  6. 访问数组索引 [0][1][0] 处存储的项目,并在控制台上打印它。
  7. 访问数组索引 [0][1][1] 处存储的项目,并在控制台上打印它。
  8. main() 函数体结束。

指向数组的指针

指针是存储地址的变量。除了使用指针存储变量地址外,还可以使用它来存储数组单元的地址。数组名始终指向其第一个元素。考虑以下声明:

int age[5];

age 是指向 $age[0] 的指针,即名为 age 的数组的第一个元素的地址。请考虑以下示例:

#include <iostream>
using namespace std;
int main()
{
	int *john;

	int age[5] = { 19, 18, 21, 20, 17 };

	john = age;

	cout << john << "\n";

	cout << *john;
	
}

输出

Pointer to an Array

请注意,第一个输出值可能因分配给数组第一个元素的地址而异,具体取决于您的计算机内存。

这是代码的屏幕截图:

Pointer to an Array

代码解释

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包含 std 命名空间,以便使用其类和函数而无需调用它们。
  3. 调用 main() 函数,程序的逻辑应添加到其中。
  4. main() 函数体的开始。
  5. 声明一个名为 *john 的指针变量。
  6. 声明一个名为 age 的整数数组来存储 5 个整数。这些整数的值也已初始化。
  7. 将变量 john 分配为数组 age 第一个索引处存储的项目的地址。
  8. 打印变量 john 的值,即数组 age 第一个索引处存储的项目的地址。
  9. 打印数组 age 中存储的第一个值。
  10. main() 函数体结束。

数组名可以用作常量指针,反之亦然。这意味着您可以使用 *(age + 3) 访问数组 age 索引 3 处存储的值。例如:

#include <iostream>
using namespace std;

int main() {
	// an array of 5 elements.
	int age[5] = { 19, 18, 21, 20, 17 };
	int *p;

	p = age;

	// output array values

	cout << "Using pointer: " << endl;

	for (int x=0; x<5; x++) {
		cout << "*(p + " << x << ") : ";
		cout << *(p + x) << endl;
	}
	cout << "Using age as address: " << endl;

	for (int x = 0; x < 5; x++) {
		cout << "*(age + " << x << ") : ";
		cout << *(age + x) << endl;
	}

	return 0;
}

输出

Pointer to an Array

这是代码的屏幕截图:

Pointer to an Array

代码解释

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包含 std 命名空间,以便使用其类和函数而无需调用它们。
  3. 调用 main() 函数,main() 函数体的开始。
  4. 注释。C++ 编译器将忽略此项。
  5. 声明一个名为 age 的数组来存储 5 个整数。
  6. 创建一个整数指针 p。
  7. 将 p 分配为数组 age 第一个元素的地址。
  8. 注释。C++ 编译器将忽略此项。
  9. 在控制台上打印一些文本。
  10. 使用 for 循环创建整数 x。 { 标记 for 循环体的开始。
  11. 在控制台上打印 x 的值以及其他一些文本。
  12. 在控制台上打印 *(p + x) 的值。
  13. for 循环体的结束。
  14. 在控制台上打印一些文本。
  15. 使用 for 循环创建变量 x。 { 标记 for 循环体的开始。
  16. 在控制台上打印 x 的值(从 0 到 4),并伴随一些其他文本。
  17. 打印 *(age + x) 的值。
  18. for 循环体结束。
  19. 如果程序成功运行,则返回此值。
  20. main() 函数体结束。

访问数组的值

数组的元素使用各自的索引进行访问。要访问的元素的索引在数组名后的方括号 [ ] 中。例如:

int john = age[2];

在上面的示例中,我们只是说明 john 的年龄存储在名为 age 的数组的索引 2 处。这意味着 john 的年龄是 age 数组中的第 3 个值。这是一个完整的 C++ 示例,展示了如何访问和打印此值:

#include<iostream>
using namespace std;
int main()
{
	int age[5] = { 19, 18, 21, 20, 17 };
	int john = age[2];
	cout << "The age of John is:"<<john;
}

输出

Accessing the values of an Array

这是代码的屏幕截图:

Accessing the values of an Array

代码解释

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包含 std 命名空间,以便使用其类和函数而无需调用它们。
  3. 调用 main() 函数,代码应添加在其中。
  4. main() 函数体的开始。
  5. 声明一个名为 age 的数组来存储 5 个整数元素。
  6. 访问数组 age 索引 2 处存储的值,并将其值存储在名为 john 的变量中。
  7. 在控制台上打印变量 john 的值以及其他文本。

C++ 中数组的优点

以下是使用 C++ 数组的优点/好处:

  • 可以轻松遍历数组元素。
  • 易于操作数组数据。
  • 可以随机访问数组元素。
  • 数组有助于代码优化;因此,我们可以用更少的代码完成更多工作。
  • 易于对数组数据进行排序。

C++ 中数组的缺点

  • 数组的大小是固定的;因此,初始化后我们无法向其添加新元素。
  • 分配的内存超过需求会导致内存浪费,而内存分配不足则可能导致问题。
  • 要存储在数组中的元素数量必须预先知道。

摘要

  • 数组是一种存储相同数据类型元素的结构。
  • 数组元素按顺序存储。
  • 数组元素的表示使用它们各自的索引。第一个元素位于索引 0 处,最后一个元素位于索引 n-1 处,其中 n 是数组元素的总数。
  • 数组的声明包括定义数组元素的数据类型以及要存储在数组中的元素数量。
  • 一维数组按顺序存储元素。
  • 二维数组以行和列的形式存储元素。
  • 三维数组是数组的数组。
  • 可以使用它们的索引将元素添加到数组中。
  • 使用它们的索引访问数组元素。
  • 多维数组具有多个维度。
  • 数组名指向其第一个元素。
  • 数组的大小是固定的,这意味着初始化后无法将新元素添加到数组中。