#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与众不同?
答案 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
是动态数组的地址。