数组中 C++声明、初始化和指针(示例)

⚡ 智能摘要

数组 C++ 数组是存储在连续内存区域中的相同数据类型元素的集合。在这里,你将学习如何声明、初始化和访问数组,数组的类型,以及它们的优缺点。

  • 📚 它是什么: 数组可以将多个相同类型的值存储在一个变量中。
  • 🔢 宣言: 声明一个数组,指定类型、名称和大小,例如 int nums[5];。
  • 🎯 索引: 数组元素通过索引访问,索引从 0 开始。
  • 🧩 初始化: 您可以使用花括号 { } 在声明时设置数组值。
  • 权衡: 数组提供快速的索引访问,但大小是固定的。
  • 🤖 人工智能帮助: GitHub Copilot 等 AI 工具可以即时生成数组循环和逻辑。

数组中 C++

什么是数组?

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

您可以将数组视为具有相似数据类型的变量的集合。您不必声明每个变量并单独为其赋值,而是可以声明一个变量(数组)并将各个变量的值添加到其中。添加到数组的每个值都由索引标识。

为什么我们需要数组?

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

在中声明一个数组 C++

数组声明在 C++ 涉及声明数组要存储的元素类型和数量。语法:

type array-Name [ array-Size ];

声明一维数组的规则 C++.

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

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

int age[5];

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

数组初始化

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

对于年龄数组,第一个元素将存储在索引 0 处,而最后一个元素将存储在索引 4 处。

让我们使用年龄数组来演示如何进行数组初始化:

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 个th 数组的元素。

数组类型

有两种类型 C++ 数组:

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

一维数组

这是一个数组,其中的数据项仅在一个维度上线性排列。它通常被称为一维数组。语法:

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

例如:

#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";
	}
}

输出:

一维数组

以下是代码截图:

一维数组

Code 说明:

  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 */
   };

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

请注意,我们只是添加了花括号来区分元素的不同行。初始化也可以按如下方式完成:

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;
}

输出:

二维数组

以下是上述代码的截图:

二维数组

Code 说明:

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包括 std 命名空间,以便使用其类和函数而无需调用它。
  3. 调用 main() 函数,其中应添加代码。
  4. main() 函数主体的开始。
  5. 一条评论。 C++ 编译器将跳过这一步。
  6. 声明一个 2 行 3 列的二维数组。项目也已添加到数组中。
  7. 一条评论。 C++ 编译器将跳过这一步。
  8. 使用 for 循环创建变量 i。此变量将遍历数组的行索引。
  9. 使用 for 循环创建变量 j。此变量将遍历数组的列索引。
  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";
}

输出:

三维阵列

以下是代码截图:

三维阵列

Code 说明:

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

指向数组的指针

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

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;
	
}

输出:

指向数组的指针

请注意,上述输出的第一个值可能会返回不同的值,具体取决于计算机内存中分配给数组第一个元素的地址。

以下是代码截图:

指向数组的指针

Code 说明:

  1. 在我们的代码中包含 iostream 头文件。它将允许我们从控制台读取和写入。
  2. 包括 std 命名空间,以便使用其类和函数而无需调用它。
  3. 调用main()函数,在其中添加程序的逻辑。
  4. main() 函数主体的开始。
  5. 声明一个名为*john的指针变量。
  6. 声明一个名为 age 的整数数组,用于存储 5 个整数。整数的值也已初始化。
  7. 将数组 age 的第一个索引中存储的项目的地址值分配给变量 john。
  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;
}

输出:

指向数组的指针

以下是代码截图:

指向数组的指针

Code 说明:

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

访问数组的值

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

int john = age[2];

在上面的例子中,我们只是说明约翰的年龄存储在名为 age 的数组的索引 2 处。这意味着约翰的年龄是第 3rd 数组 age 中的值。下面是完整的 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;
}

输出:

访问数组的值

以下是代码截图:

访问数组的值

Code 说明:

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

数组的优点 C++

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

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

数组的缺点 C++

  • 数组具有固定的大小;因此,初始化后我们不能向其中添加新元素。
  • 分配超过要求的内存会导致内存空间浪费,而分配较少的内存又会产生问题。
  • 必须事先知道数组中要存储的元素数量。

常见问题

数组 C++ 是将相同数据类型的元素存储在连续内存位置的集合。它允许您使用一个变量名和一个索引来存储和访问多个值。

声明一个数组,用方括号括起来,写上数据类型、名称和大小,例如 `int numbers[5];`。这会在内存中预留五个整数的空间。

可以使用方括号内的索引访问数组元素,例如 numbers[0] 表示第一个元素。数组索引从 0 开始,一直到数组大小减 1。

在声明数组时,可以使用花括号初始化数组,例如 int nums[3] = {1, 2, 3};。也可以稍后通过索引赋值,例如 nums[0] = 5;。

C++ 支持用于简单列表的一维数组,以及用于数值表格或网格的多维数组,例如二维数组。

数组提供快速的索引访问和高效的数据存储,但它们的大小在声明时就已固定,初始化后不能增长。

GitHub Copilot 等 AI 助手会在您输入时生成数组声明、编写循环来填充或搜索数组,并针对越界索引错误提供修复建议。

是的。人工智能工具会标记越界访问、差一错误和未初始化的数组,并建议使用更安全的替代方案,例如用于动态数据的 std::vector。

总结一下这篇文章: