堆空间内开拓的数组的地址的地址是什么
堆空间内开辟的数组的地址的地址是什么?
上代码:
结果示例如下:
9
9
0035FBC4
0035FBC4
0035FBC4
9
9
00174D28
0035FBB8
00174D28
也就是说&A同&A[0]的结果一致,而&B同&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是一样的。
上代码:
- 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]的结果不一致,这是为什么?
------解决方案--------------------
------解决方案--------------------
因为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是一样的。