C++ 指针和数组地址

C++ 指针和数组地址,c++,pointers,memory-address,C++,Pointers,Memory Address,我只是在玩指针,发现了这个奇怪的东西。我创建了指针p并显示了它的地址,正如我在下面的程序中所做的那样,p和&p的地址不同,为什么它们不同 int main() { int *p, s[5]; cout << p <<endl; cout << &p <<endl; p = s; cout << p <<endl; cout << &p <<

我只是在玩指针,发现了这个奇怪的东西。我创建了指针
p
并显示了它的地址,正如我在下面的程序中所做的那样,
p
&p
的地址不同,为什么它们不同

int main()
{
    int *p, s[5];
    cout << p <<endl;
    cout << &p <<endl;
    p = s;
    cout << p <<endl;
    cout << &p <<endl;
}
intmain()
{
int*p,s[5];

cout
p
是一个指针,意味着它拥有一个指向整数的地址。因此,当你打印p时,它会显示它指向的整数的地址。而当你打印
&p
时,你实际上是在打印p本身的地址,而不是它指向的地址。

正如Jeeva所说,指针p也占用了一部分内存(图中的黄色部分,其地址为0x300),在该区域中,它持有数组s的地址值。因此p==0x100和&p==0x300

如果
p
等于
&p
,指针将指向自身,这仅在空指针下才可能:

void* p = &p;
assert(p == &p);
不过,我还没有看到它的实际用途:)


哦,等等,它也发生在自引用递归数据结构中,这可能非常有用:

struct X
{
    X* p;

    void print()
    {
        std::cout << " p = " <<  p << '\n';
        std::cout << "&p = " << &p << '\n';
    }
};

X x;
x.p = &x;
x.print();

为什么?因为一个对象在内存中的起始地址通常与它的第一个数据成员相同。

实际上我没有领会你的意思。你的意思是&p显示指针本身的地址吗?但s数组不是这样的。s和s返回相同的地址。为什么?因为s不是指针,它是数组。当你说“s”时,它指向t数组的基址,就像是说&sman,我有点忘了这一切。我精通这些东西,但已经有一段时间我对C++@Umer一无所知:如果
s
是一个数组,比如说,类型
int[10]
,如果您尝试打印它,它将自动转换为指向其第一个元素的指针,该元素的类型为
int*
&p
的类型为
int(*)[10]
。从类型中可以看出,
&p
指向整个数组,而不仅仅是第一个元素。但是,由于数组及其第一个元素在内存中的相同地址开始,因此可以获得相同的输出。我们提供了一个您可能会感兴趣的示例。
 p = 0x7fffb4455d40
&p = 0x7fffb4455d40