关于每个数据类型个字节在内存中的存储地址(以int为例)
先上图
如题,为什么说好的*p = &c是1啊,为什么是513呢,一开始,我也觉得挺惊讶的,后面听老师分析了一下才知道怎么回事,但是还是有那么一个为题不知道怎么回事,经过上网查了下资料,终于有了些眉目,但是一样有一个问题(后面回说道),切让我抛砖引玉。
要理解这个程序,首先我们要了解每个数据类型的字节排序
而字节排序又分两种:一种是 big endian 一种是little endian
big endian意思是讲高序字节(高位)存储到所分配到内存起始位置,而little endian是讲低字节(地位)存储到所分配到内存的起始位置。
如下图
了解了吧,然后再说话题目,为什么是513呢?
是因为int *p 这个int是用于取值用得,记住是取值用得,而分配内存用到的指针是8个字节,这个不用说了把,在一个系统里面指针是固定字节数的,不分数据类型,在我这台机器上是8个字节,一般都是8个字节的。
所以,当int类型的指针p指向char类型的指针的时候,取得不是一个字节,也不是8个字节,是4个字节(int类型的)
所以从内存地址ff10记起,取四个字节,好了,上面那张excel图里面,就是从0000 0001往下数四行,在通过高到低排序,有几种可能,但是要得到结果513,只有一种可能,就是第一幅图,并且排序是从下往上(高位到低位),还有一点,java的字节排序都是big endien的,而c的就是分cpu的。
还有一个问题,在第一张图,为什么内存地址相差一位呢?有没有一种方法可以取得数据类型的每一个字节所在内存地址呢?还是我概念有些模糊了?仅个人见解,如有不对请不要给面的指出。欢迎交流q1413557667
时间: 2024-10-12 15:55:14