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

时间:2020-07-27 11:23:30

标签: 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;
}

这是我的代码,我使用new创建动态数组,但是数组地址确实让我感到困惑,为什么&q与众不同?

4 个答案:

答案 0 :(得分:5)

表达式&q是指向变量q的指针,它确实与q指向的位置不同。

您可以这样看:

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

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

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

&q&p之间在语义上也有很大的不同:它们的类型。

&q的类型为int**,而&p的类型为int (*)[3]

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

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

答案 1 :(得分:0)

因为q是一个指针,所以它不会像数组那样衰减到指针。在这种情况下,&q表示指向指针q的指针,而&q [0]表示指向被取消引用的q的指针,换句话说q本身。

答案 2 :(得分:0)

p是一个数组。 q是一个指针。数组包含实际数据。因此,指向数组&p的指针p直接指向数据。

指针q是一个包含动态数组地址的变量。指针的地址与数据的地址不同。

此代码段描述了会发生什么:

#include<iostream>
using namespace std;


int main()
{
    // new int[3] creates an array
    // int *q creates a pointer pointing to the array
    int* q = new int[3];
    cout << &q[0] << endl;
    cout << q << endl;  
    cout << &q << endl; // why here is different?

    // int p[3] creates an array
    int p[3];
    // int *pp creates a pointer pointing to the array
    int *pp = p;
    cout << &pp[0] << endl;
    cout << pp << endl;
    cout << &pp << endl;



    return 0;
}

区别在于,在第一种情况下您无法访问动态数组。它没有名字。只能通过指针p来访问它。

在第二种情况下,数组的名称为p,您可以直接或通过指针pp对其进行访问。

答案 3 :(得分:0)

动态数组的地址为q&q是动态数组的地址。