C++ 指针和数组

在本教程中,我们将通过示例了解数组和指针之间的关系。

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

考虑这个例子:

int *ptr;
int arr[5];

// ptr 指针存储 arr 数组的死一个元素
ptr = arr;

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

请注意,我们使用了 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];

同样,我们可以使用单个指针访问元素。例如,

// use dereference operator
*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++ 指针
使用数组处理 C++ 指针

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

同样,如果 ptr 指针指向 char 类型数据,然后 ptrptr + 1 之间的地址相差是 1 个字节。这是因为一个 char 的大小是 1 个字节。

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

// C++ Program to display address of each element of an array

#include <iostream>
using namespace std;

int main()
{
    float arr[3];

    // declare pointer variable
    float *ptr;

    cout << "Displaying address using arrays: " << endl;

    // use for loop to print addresses of all array elements
    for (int i = 0; i < 3; ++i)
    {
        cout << "&arr[" << i << "] = " << &arr[i] << endl;
    }

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

    cout<<"\nDisplaying address using pointers: "<< endl;

    // use for loop to print addresses of all array elements
    // using pointer notation
    for (int i = 0; i < 3; ++i)
    {
        cout << "ptr + " << i << " = "<< ptr + i << endl;
    }

    return 0;
}

输出

Displaying address using arrays:
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8

Displaying address using pointers:
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8

在上面的程序中,我们首先简单地打印了数组元素的地址。

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

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

但是,我们应该记住,指针和数组是不一样的。

在少数情况下,数组名称不会衰减为指针。

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

用指针表示法插入数组和显示数组数据的 C++ 程序。

#include <iostream>
using namespace std;

int main() {
    float arr[5];

   // Insert data using pointer notation
    cout << "Enter 5 numbers: ";
    for (int i = 0; i < 5; ++i) {

        // store input number in arr[i]
        cin >> *(arr + i) ;

    }

    // Display data using pointer notation
    cout << "Displaying data: " << endl;
    for (int i = 0; i < 5; ++i) {

        // display value of arr[i]
        cout << *(arr + i) << endl ;

    }

    return 0;
}

输出

Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data:
2.5
3.5
4.5
5
2

这里,

  1. 我们首先使用指针表示法将用户输入的数字存储到 arr 数组中.

    cin >> *(arr + i) ;
    

    此代码等效于以下代码:

    cin >> arr[i];
    

    请注意,我们没有声明一个单独的指针变量,而是对数组名 arr 使用了指针符号。

    正如我们已经知道的,数组名 arr 指向数组的第一个元素。所以,我们可以想到 arr 就像一个指针一样。

  2. 同样,我们然后在 for 循环中对 arr 使用指针表示法。

    cout << *(arr + i) << endl ;
    

    这段代码相当于

    cout << arr[i] << endl ;