堆空间内开拓的数组的地址的地址是什么

堆空间内开辟的数组的地址的地址是什么?
上代码:

C/C++ code
#include<iostream>
using namespace std;
int main(){
    int A[10]={9,8,7,6,5,4,3,2,1,0};  //栈空间开辟
    cout<<*A<<endl;  //A指向数组的首地址,解引用即为9
    cout<<A[0]<<endl;  
    cout<<&A[0]<<endl;  //A[0]为数组的第一个元素,取地址
    cout<<&A<<endl;  //A为数组第一个元素的地址,该元素应该存放在栈上,&A取地址的地址
    cout<<A<<endl;  //A为数组的首地址

    int *B;
    B=new int[10];  //堆空间开辟
    B[0]=9;
    cout<<*B<<endl;  //B指向数组的首地址,解引用即为9
    cout<<B[0]<<endl;
    cout<<&B[0]<<endl;  //B[0]为数组的第一个元素,取地址
    cout<<&B<<endl;  //B为数组第一个元素的地址,该元素应该存放在堆上,&B取地址的地址
    cout<<B<<endl;  //B为数组的首地址
    delete B;
    system("pause");
}



结果示例如下:
9
9
0035FBC4
0035FBC4
0035FBC4
9
9
00174D28
0035FBB8
00174D28

也就是说&A同&A[0]的结果一致,而&B同&B[0]的结果不一致,这是为什么?

------解决方案--------------------
探讨
B是指针,&amp;B是取指针的地址。
B[0]是指针指向的数组中的第一个元素的地址,也就是首地址。
B和&amp;B[0]的结果才一致,因为都是数组的首地址。

------解决方案--------------------
因为A不是一个指针实体,也就不是一个变量实体。就单单拿A来看,它是不存在的,也就是不占内存的。A是一个数,而不是一个变量。但A数组是一个实体,这就解释了为什么A的地址和数组的地址是一样的了。
对B而言,B本身就是一个变量,是实体。而局部变量就存在于栈中,所以结果中看到,B的地址和上面数组A的地址距离很近(都在栈里面)。而B的值可以看到,很明显就是在堆中了。&B和&B[0]不一样也很显然了,因为B是一个变量实体,所以,B有自己的地址。而B[0]是存在于堆中的,地址肯定和B不一样。
------解决方案--------------------
B在栈里
B[0]在堆里
------解决方案--------------------
B[0]是数组第一个元素地址,对它取地址就是数组首地址,这是一个堆地址。

B本身是个局部变量,对它取地址得到的是它本身所在的地址,这肯定是个栈地址。

&A和&A[0]地址一样是语言本身就这么规定的。准确的说是A和&A是一样的。