当我在指针地址中加起来时它指向我的数组?为什么?引用和取消引用混淆 C++

When I add up in my pointer address it points to my array? Why? Reference and Dereference confusion C++

在这个例子中, 我有一个包含四个元素的数组。我已经声明了一个指向包含数组地址的整数的指针。然后我以 3 种不同的方式显示了第 0 个索引的地址。同样,第一个索引的地址以 3 种不同的方式显示。当我输出这个 (&pNumbers)+0 时,它会显示一个唯一且不同的地址,这是可以理解的。在下一行中,*(&pNumbers+0) 显示第 0 个索引地址(因为它包含在指针中)。现在问题部分来了。在输出此 (&pNumbers)+1 行时,它再次显示数组第 0 个索引。为什么?

第一个问题: 当我检索指针地址 (&pNumbers) 时,它会显示新的唯一地址。但是当我在那个地址加起来的时候。它是如何访问数组的元素地址的? 例如

enter code here

cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl // new address + 1 but showing address of 0 element.

cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl // showing address of of 1st index

第二个问题: 如果说它确实以某种方式指向相应的数组元素。在取消引用时,为什么它没有显示与数组元素对应的正确数据值。 例如

enter code here
cout<<" *(&pNumbers+1) "<< *(&pNumbers+1) // assumption was 31 (but displaying some 0x1f)

cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl // assumption was 28 (but displpaying 0x1c)

下面是源代码:

#include <iostream>
#include <string>
#include <conio.h>

using namespace std;

int main()
{int number[] = { 31, 28, 31, 30};
    int *pNumbers = number;

    cout<<" Address of number[0] "<<number<<endl;
    cout<<" Address of number[1] "<<number+1<<endl;
    cout<<" Address of number[2] "<<number+2<<endl;
    cout<<" Address of number[3] "<<number+3<<endl<<endl;

    cout<<" Address of &pNumbers "<< &pNumbers<<endl<<endl; // address of pNumbers

    cout<<" Address of number "<< number<<endl; // address of array's first element
    cout<<" pNumber Address "<< pNumbers<<endl;
    cout<<" &(pNumbers[0]) "<< &(pNumbers[0])<<endl<<endl;

    cout << " pNumbers+1:  " << pNumbers+1<<endl; //address of array's second element
    cout<<" (&pNumbers[1]) "<<(&pNumbers[1])<<endl; //
    cout<<" (pNumbers+1) "<< (pNumbers+1) <<endl<<endl;

    cout<<" (&pNumbers)+0 "<< (&pNumbers)+0<<endl;
    cout<<" *(&pNumbers+0) "<< *(&pNumbers+0)<<endl<<endl;

    cout<<" (&pNumbers)+1 "<<(&pNumbers)+1<<endl<<endl; // new address + 1 expected but displaying array's 0th index address why ?
    cout<<" *(&pNumbers+1) "<<*(&pNumbers+1)<<endl<<endl;

    cout<<" (&pNumbers + 2) "<<(&pNumbers+2)<<endl<<endl;
    cout<<" *(&pNumbers + 2) "<<*(&pNumbers+2)<<endl<<endl;

    cout<<" (&pNumbers + 3) "<<(&pNumbers+3)<<endl<<endl;
    cout<<" *(&pNumbers + 3) "<<*(&pNumbers+3)<<endl<<endl;

    cout<<" (&pNumbers + 4) "<<(&pNumbers+4)<<endl<<endl;
    cout<<" *(&pNumbers + 4) "<<*(&pNumbers+4)<<endl<<endl;

    return 0;
}

这是大多数平台上堆栈的内存布局。

On outputting this (&pNumbers)+1 line it displays the array 0th index again. Why ?

您的代码获取 pNumbers 内存单元的地址(&pNumbers 的类型为 int **),然后向其添加一个,其语义是按指针的大小递增它,因此表达式 &pNumbers + 1 是原始数组的地址,因为 pNumbers 变量本身就是一个指针。

关于你的第二个问题,表达式 *(&pNumbers+1) 所做的基本上是试图将存储 int 的内存位置解释为指向 int 的指针(int **(&pNumbers+1) 的类型).这就是为什么您看到 int 为十六进制而不是 dec 格式的原因。换句话说,您将 number[0] 视为 int * 并打印它。

所有这些东西中可能令人困惑的是,数组被视为指向其第一个元素的指针,这导致 number&number 本质上是相同的地址(但两个表达式具有不同的类型)

希望能有所帮助。