本文章的内容是:内存和指针的终极认识!
我们先来看这么一个题目:
===================================================
在x86平台下,分析以下代码的输出结果:
#include <stdio.h>
int main(void)
{
int a[4] = {1, 2, 3, 4};
int *p1=(int *)(&a+1); //p1指向数组的下一个单元的首地址.
int *p2=(int *)((int)a+1); //
printf("%x, %x\n", p1[-1], *p2);
}
请问结果是什么呢? ------------请不要直接看下面的答案,
先花五分钟想想 &a 是什么意思 、(int)a 又是什么意思?
.
.
.
.
.
.
.
.
.
.
.
. 你
.
.
.决
.
.
.定
.
.
.看
.
.
.下
.
.
.面
.
.
.的
.
.
.答案了?
.
.
.
.
.
好吧,来到这里的人肯定不简单的 <`0_0`>...
现在我来解释刚才提到的来个问题:
1.&a是什么>>>>>>>>>>&a 取整个数组的地址,作用目标是整个数组! 4*4个字节(32位操作系统)
2.(int)a是什么>>>>>>>>> 将a强制转换为整形进行运算
先说第一个结果: 4
&a后加一就偏移了4*4个字节,然后就强制转换成(int *)类型(因为在那个位置里我们并没有定义它!所以需要强制转换)
p[-1] 等价于 *(p - 1) 又因为p是int *类型的(作用目标是4个字节),所以p[-1]向后偏移4个字节.
所以p[-1]的位置: a + 4*4 - 4;(相当于向后偏移了3个元素) 也就是第四个元素的首地址
第二个结果呢?------这里插一句: 对于第一个结果的分析可以看到是用了内存和指针的关系,这也是为了下面做铺垫
a的首地址为0;由于小端模式(不知道就自行百度吧...).
因为取四个字节的数据,所以取出的结果是01000000 00000000 00000000 ......0(二进制总共32位),
又由于十六进制打印所以打印结果是 20000000(4字节的十六进制为八位).