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

深夜代码党 2012-07-11 08:49:13
上代码:

#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]的结果不一致,这是为什么?
...全文
224 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanshen2891 2012-07-11
  • 打赏
  • 举报
回复
B[0]是数组第一个元素地址,对它取地址就是数组首地址,这是一个堆地址。

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

&A和&A[0]地址一样是语言本身就这么规定的。准确的说是A和&A是一样的。
dushuchen 2012-07-11
  • 打赏
  • 举报
回复
B在栈里
B[0]在堆里
时间坐标 2012-07-11
  • 打赏
  • 举报
回复
因为A不是一个指针实体,也就不是一个变量实体。就单单拿A来看,它是不存在的,也就是不占内存的。A是一个数,而不是一个变量。但A数组是一个实体,这就解释了为什么A的地址和数组的地址是一样的了。
对B而言,B本身就是一个变量,是实体。而局部变量就存在于栈中,所以结果中看到,B的地址和上面数组A的地址距离很近(都在栈里面)。而B的值可以看到,很明显就是在堆中了。&B和&B[0]不一样也很显然了,因为B是一个变量实体,所以,B有自己的地址。而B[0]是存在于堆中的,地址肯定和B不一样。
灼眼的超哥 2012-07-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
B是指针,&B是取指针的地址。
B[0]是指针指向的数组中的第一个元素的地址,也就是首地址。
B和&B[0]的结果才一致,因为都是数组的首地址。
[/Quote]
少打了个&,改正:“&B[0]是指针指向的。。。”
灼眼的超哥 2012-07-11
  • 打赏
  • 举报
回复

B是指针,&B是取指针的地址。
B[0]是指针指向的数组中的第一个元素的地址,也就是首地址。
B和&B[0]的结果才一致,因为都是数组的首地址。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧