C++ 指针数组

2025 年 3 月 7 日 | 阅读 4 分钟

数组和指针彼此密切相关。在 C++ 中,数组的名称被视为指针,即数组的名称包含元素的地址。C++ 将数组名视为第一个元素的地址。例如,如果我们创建一个名为 marks 的数组,它存储 20 个整数类型的值,那么 marks 将包含第一个元素(即 marks[0])的地址。因此,我们可以说数组名 (marks) 是一个指向数组第一个元素的指针。

让我们通过一个例子来理解这种情况。

示例

在上面的代码中,我们声明了一个整数指针和一个整数类型的数组。我们通过语句 ptr=marks; 将 marks 的地址赋给 ptr;这意味着变量 'marks' 和 'ptr' 都指向同一个元素,即 marks[0]。当我们尝试打印 *ptr 和 *marks 的值时,它们是相同的。因此,证明了数组名存储数组第一个元素的地址。

输出

C++ Array of Pointers

指针数组

指针数组是一个由指针类型变量组成的数组,这意味着该变量是一个指向其他元素的指针。假设我们创建一个包含 5 个整数指针的指针数组;那么它的声明将如下所示

在上面的声明中,我们声明了一个名为 ptr 的指针数组,它在内存中分配了 5 个整数指针。

指针数组的元素也可以通过分配其他元素的地址来初始化。让我们通过一个例子来观察这种情况。

在上面的代码中,我们将变量 'a' 的地址分配给数组 'ptr' 的第三个元素。

我们还可以通过解引用指针来检索 'a' 的值。

让我们通过一个例子来理解。

示例

在上面的代码中,我们声明了一个整数类型的数组和一个整数指针数组。我们定义了 'for' 循环,它遍历数组 'ptr1' 的元素,在每次迭代中,ptr1 中索引 'i' 处的元素的地址存储在 ptr2 中索引 'i' 处。

输出

C++ Array of Pointers

到目前为止,我们已经学习了指向整数的指针数组。现在,我们将看到如何创建指向字符串的指针数组。

指向字符串的指针数组

指向字符串的指针数组是一个字符指针数组,它保存字符串第一个字符的地址,或者我们可以说字符串的基地址。

以下是指向字符串的指针数组和二维字符数组之间的区别

  • 在内存消耗方面,指向字符串的指针数组比二维字符数组更高效,因为指向字符串的指针数组消耗的内存比二维字符数组少,以存储字符串。
  • 在指针数组中,字符串的操作相对容易,比二维数组更容易。我们还可以通过使用指针轻松更改字符串的位置。

让我们看看如何声明指向字符串的指针数组。

首先,我们声明指向字符串的指针数组

在上面的代码中,我们声明了一个大小为 5 的名为 'names' 的指针数组。在上面的情况下,我们在声明时进行了初始化,因此我们不需要提及指针数组的大小。上面的代码可以改写为

在上述情况下,'names' 数组的每个元素都是一个字符串字面量,每个字符串字面量都将保存字符串第一个字符的基地址。例如,names[0] 包含 "john" 的基地址,names[1] 包含 "Peter" 的基地址,依此类推。不能保证所有字符串字面量都将存储在连续的内存位置,但字符串字面量的字符存储在连续的内存位置。

让我们创建一个简单的例子。

示例

编译并运行

在上面的代码中,我们声明了一个包含 5 个字符串字面量的 char 指针数组,每个字符串的第一个字符都保存着字符串的基地址。

输出

john
Peter
Marco
Devin
Ronan

下一主题C++ 空指针