0

在此示例中,我有一个包含四个元素的数组。我已经声明了一个指向包含数组地址的整数的指针。然后我以 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;
}
4

1 回答 1

0

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

在输出此 (&pNumbers)+1 行时,它再次显示数组第 0 个索引。为什么 ?

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

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

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

希望能有所帮助。

于 2015-05-31T08:54:39.540 回答