跳到主要内容

C++ 指针和数组

提示
  1. 指针和数组的关系:在C++中,指针可以存储数组元素的地址。通过使用指针和数组名称,可以访问数组中的元素。
  2. 访问数组元素:使用指针加偏移量的方式可以访问数组的每个元素。例如,ptr + 1 等价于数组中的 &arr[1]
  3. 数组名称作为指针:数组名称在大多数情况下可以作为指针使用。例如,*(arr + i)arr[i] 是等价的,表示访问数组中的第i个元素。

在C++中,指针是存储其他变量地址的变量。指针不仅可以存储单个变量的地址,还可以存储数组单元的地址。

考虑以下示例:

int *ptr;
int arr[5];

// 将 arr 的第一个
// 元素的地址存储在 ptr 中
ptr = arr;

这里,ptr 是一个指针变量,而 arr 是一个 int 数组。代码 ptr = arr; 将数组第一个元素的地址存储在变量 ptr 中。

注意我们使用了 arr 而不是 &arr[0]。这是因为两者是相同的。所以,下面的代码与上面的代码是相同的。

int *ptr;
int arr[5];
ptr = &arr[0];

数组其余元素的地址由 &arr[1]&arr[2]&arr[3]&arr[4] 给出。

指向数组的每个元素

假设我们需要使用相同的指针 ptr 指向数组的第四个元素。

这里,如果 ptr 指向上面示例中的第一个元素,那么 ptr + 3 将指向第四个元素。例如,

int *ptr;
int arr[5];
ptr = arr;

ptr + 1 等价于 &arr[1];
ptr + 2 等价于 &arr[2];
ptr + 3 等价于 &arr[3];
ptr + 4 等价于 &arr[4];

类似地,我们可以使用单个指针访问元素。例如,

// 使用解引用运算符
*ptr == arr[0];
*(ptr + 1) 等价于 arr[1];
*(ptr + 2) 等价于 arr[2];
*(ptr + 3) 等价于 arr[3];
*(ptr + 4) 等价于 arr[4];

假设我们已经初始化了 ptr = &arr[2]; 那么

ptr - 2 等价于 &arr[0];
ptr - 1 等价于 &arr[1];
ptr + 1 等价于 &arr[3];
ptr + 2 等价于 &arr[4];

C++ 指针与数组的工作原理

注意: ptr 和 ptr + 1 之间的地址差异为 4 字节。这是因为 ptr 是指向 int 数据的指针。在64位操作系统中,int 的大小为 4 字节。

类似地,如果指针 ptr 指向 char 类型数据,则 ptr 和 ptr + 1 之间的地址为 1 字节。这是因为字符的大小为 1 字节。

示例 1:C++ 指针和数组

// C++ 程序显示数组每个元素的地址

#include <iostream>
using namespace std;

int main()
{
float arr[3];

// 声明指针变量
float *ptr;

cout << "使用数组显示地址:" << endl;

// 使用 for 循环打印所有数组元素的地址
for (int i = 0; i < 3; ++i)
{
cout << "&arr[" << i << "] = " << &arr[i] << endl;
}

// ptr = &arr[0]
ptr = arr;

cout << "\n使用指针显示地址:" << endl;

// 使用指针表示法和 for 循环打印所有数组元素的地址
for (int i = 0; i < 3; ++i)
{
cout << "ptr + " << i << " = " << ptr + i << endl;
}

return 0;
}

输出

使用数组显示地址:
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8

使用指针显示地址:
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8

在上面的程序中,我们首先使用指针变量 ptr 在不使用指针的情况下打印了数组元素的地址。

然后,我们使用指针 ptr 指向 a[0] 的地址,ptr + 1 指向 a[1] 的地址,依此类推。

在大多数情况下,数组名称衰减为指针。简单地说,数组名称被转换为指针。这就是为什么我们可以使用指针访问数组元素的原因。

然而,我们应该记住,指针和数组不是同一个东西。

有一些情况下,数组名称不会衰减为指针。要了解更多,请访问:数组名称什么时候不会衰减为指针?

示例 2:数组名称用作指针

// C++ 程序使用指针表示法插入和显示用户输入的数据。

#include <iostream>
using namespace std;

int main() {
float arr[5];

// 使用指针表示法插入数据
cout << "输入 5 个数字:";
for (int i = 0; i < 5; ++i) {

// 将输入的数字存储在 arr[i]
cin >> *(arr + i) ;

}

// 使用指针表示法显示数据
cout << "显示数据:" << endl;
for (int i = 0; i < 5; ++i) {

// 显示 arr[i] 的值
cout << *(arr + i) << endl ;

}

return 0;
}

输出

输入 5 个数字:2.5
3.5
4.5
5
2
显示数据:
2.5
3.5
4.5
5
2

这里,

  1. 我们首先使用指针表示法将用户输入的数字存储到数组 arr 中。
cin >> *(arr + i) ;

这段代码等同于以下代码:

cin >> arr[i];

注意我们没有声明一个单独的指针变量,而是使用数组名称 arr 进行指针表示法。

正如我们已经知道的,数组名称 arr 指向数组的第一个元素。所以,我们可以将 arr 看作像指针一样行事。

  1. 同样,我们接着使用 for 循环使用指针表示法显示 arr 的值。
cout << *(arr + i) << endl ;

这段代码等同于

cout << arr[i] << endl ;