![5cdadb860f352c0e4c2c1dea203989e2.png](https://i-blog.csdnimg.cn/blog_migrate/c95fffa4ff1c4a09138063501895b18a.jpeg)
当我们知道指针就是指向某种数据的地址后,不禁就会产生一种冲动,想看看数据在内存中到底是如何存储的,下面通过一段代码探究一下(在下例中int为4个字节,short为2个字节,char为1个字节):
int i1=69649;int i2=286261504;//定义两个整形变量,十六进制分别为00 01 10 11、11 10 01 00short k1=12835;short k2=5141;//定义两个短整形变量,十六进制分别为32 23、14 15char c1='0';char c2='1';//定义两个字符变量,十六进制分别为30、31cout<
得出结果如下:
![c1ecd33d7a81784169c76d68a28f89ea.png](https://i-blog.csdnimg.cn/blog_migrate/21396d6ca03822b276784b39813d5a76.jpeg)
从输出的地址来看,程序中连续定义的若干个变量以各个块(int以4个字节为一块、short以2个字节为一块、char以1个字节为一块)为单位存储在相邻的内存空间,各个块地址值按降序排列。
那么在每个数据对应的块内,数据又是如何存储的呢?
下面先定义char指针变量pc指向存储字符c2内存的前一个字节地址,定义一个short和一个int空指针。然后从c2对应的内存位置开始,char指针递增,为short和int指针赋值,循环输出各类型指针对应块内存储的数据(char为输出每个字节内存储数据,为ASCII码;short输出当前1个字节位置及增加1个字节后共2个字节内存储的数据;int输出当前1个字节位置及增加3个字节后共4个字节内存储的数据)。
char *pc=&c2-1;short *pk=NULL;int *pi=NULL;for(int i=1;i<=14;i++){cout<
输出结果如下所示:
![6fb1a97847dbd5bd99510b842aa57ac2.png](https://i-blog.csdnimg.cn/blog_migrate/5c5d9d3bada8a8b4c3731c8baf542cdb.jpeg)
因此我们得出各个字节内存所存储的数据如下表:
![745db0cbbadc2592fd9cca8eee6b7dee.png](https://i-blog.csdnimg.cn/blog_migrate/ddd5f19d343921b9982dbb19f1d9f448.jpeg)
最后得出结论:
1.变量以各个块(int以4个字节为一块、short以2个字节为一块、char以1个字节为一块)为单位存储,连续定义的变量按降序排列在相邻的内存空间里。
2.在每个数据对应的内存块内,数据以字节为单位从高到底依次存储。
3.对多字节数据来说,该类型数据的地址(即指针值)为该类型数据最后一个字节的内存地址。