C++ 指针和数组

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

请看这个例子

int *ptr;
int arr[5];

// store the address of the first
// element of arr in 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 is equivalent to &arr[1];
ptr + 2 is equivalent to &arr[2];
ptr + 3 is equivalent to &arr[3];
ptr + 4 is equivalent to &arr[4];

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

// use dereference operator
*ptr == arr[0];
*(ptr + 1) is equivalent to arr[1];
*(ptr + 2) is equivalent to arr[2];
*(ptr + 3) is equivalent to arr[3];
*(ptr + 4) is equivalent to arr[4];

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

ptr - 2 is equivalent to &arr[0];
ptr - 1 is equivalent to &arr[1]; 
ptr + 1 is equivalent to &arr[3];
ptr + 2 is equivalent to &arr[4];
Working of C++ Pointers with Arrays
C++指针与数组的协同工作

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

同样,如果指针ptr指向char类型数据,那么ptrptr + 1之间的地址是1个字节。这是因为字符的大小是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的情况下,简单地打印了数组元素的地址。

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


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

但是,我们应该记住,指针和数组并不相同。

在少数情况下,数组名不会衰变成指针。想了解更多,请访问:数组名何时不会衰变成指针?


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

// C++ Program to insert and display data entered by using pointer notation.

#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 ;
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战