栈里面的内存地址分配是从大往小分配。即没每次压栈,栈顶指针-1(不一定是1,这个要根据数据类型来分配). 堆里面的数据地址分配是从小到大分配的,每次往堆里面压如一个数,相应的地址要增加。
对于单字节变量来说,地址分配比较容易,即选择一个没有分配的地址给它。但是对于对字节变量来说,地址分配,则没有单字节那么容易理解: 首先说说little-endian和big-endian的概念
little-endian:数据地位字节放在低地址处,一次排列,数据高位字节放在高低地址处。
big-endian则刚刚相反。
有了这个了解,再来看看数据分配问题: 例如: unsigned short int s_int_data = 0x4142; 这里很明显,short int是2个字节的数据。那么为了表示这个数据,s_int_data应该有一个地址,那么,对于多地址数据来说,我们所说的地址就是该多字节数据的首地址,这个首地址应该是该数据所在空间中地址最小的一个,更详细的说:假如给s_int_data分配的地址依次是 2001,2000,那么这个首地址应该是2000。即s_int_data的地址为2000,那么在这两个字节中,数据的高位字节存放在2001,地位字节存放在2000. 而对于通常我们使用的x86构架的PC来说,都是little-endian类型的。
一下代码可以更加详细的说明这些理论:
#include "iostream" using namespace std; int main() { //int c_demo = 0; //int i_demo = 5; unsigned short int tow_byte = 0x4142;//高位字节存放的是字符串A,地位字节存放的是字符串B cout << "the low byte data is " << *(unsigned char *)&tow_byte<<endl; cout << "the high byte data is" << *((unsigned char *)&tow_byte +1)<<endl;//这里是+1,并不像内存地址分配时从大到小的 cout << "the address of the data is = " << &tow_byte<<endl; //cout << "int address = " << &i_demo<<endl; return 0; }
版权申明:
转载文章请注明原文出处http://blog.csdn.net/feiyinzilgd/archive/2010/12/21/6089413.aspx