为什么动态数组的地址与首元素地址不同?

xmz*_*ang 2 c++ arrays dynamic-arrays

#include<iostream>
using namespace std;


int main()
{
    int* q = new int[3];
    cout << &q[0] << endl;
    cout << q << endl;  
    cout << &q << endl; // why here is different?

    int p[3];
    cout << &p[0] << endl;
    cout << p << endl;
    cout << &p << endl;



    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码,我使用new来创建动态数组,但是数组地址真的让我很困惑,为什么&q不一样?

Som*_*ude 5

表达式&q是一个指向变量 的指针q,它确实和 whereq所指向的不同。

你可以这样看:

+----+ +---+ +------+------+------+
| &q | --> | | | --> | q[0] | q[1] | q[2] |
+----+ +---+ +------+------+------+

另一方面p是一个数组, where&p是指向数组本身的指针:

+----+ +------+------+------+
| &p | --> | p[0] | p[1] | p[2] |
+----+ +------+------+------+

&q和之间也有很大的语义差异&p:它们的类型。

的类型&qint**&p而是类型int (*)[3]

这也解释了为什么&p并且&p[0]似乎是相同的,它们都指向同一个位置。但这里也有语义差异,类型&p[0]int*

最后,数组可以衰减为指向其第一个元素的指针,这意味着它p与 相同&p[0],甚至具有相同的类型。