第一次写博客,若有不当之处,请指出,谢谢。
最近忙于面试,对于指针有一点新的认识,写下感悟与大家分享。
面试题目,将0x04030201变成0x01020304,刚开始没有多想,之前写过寄存器,就想了一个蠢方法。
通过按位与将0x04030201中的4个字节拆成0x04,0x03,0x02,0x01,然后通过移位运算将0x01变成0x01000000,0x02变成0x00020000,0x03变成0x00000300,0x04不变,最后将这些数据组合起来,就能得到0x01020304。这是我给的答案,然后面试官一脸黑线,我想我是搞砸了。
面试官给了一个提示如下:
int num = 0x04030201;
char * p = (char *)#
看到上面的写法,刚开始有点懵逼,从来没有这么干过,当时一紧张,没答上来,面试没戏了。回来的路上,一直在想这是个啥意思呢?然后在虚拟机上跑了以下得到如下数据:
*p = 1;
p++;
*p = 2;
p++;
*p = 3;
p++;
*p = 4;
看到这些数据感觉是不是狠熟悉呢?它将之前我做的那些拆解过程,全部实现了。
分析如下:
int num = 0x04030201;将0x04030201以32位的数据形式放在内存中,通常我们会定义一个整型指针来指向这个内存地址,然后可以直接获取到num的值。但是现在它是将一个char型的指针指向这个内存地址,char 型与int 型指针的区别在哪里呢?偏移大小不一样,指针在32位机器上,地址就是4个字节,但是int型指针每次偏移就是一个int,也就是4个字节,char 型指针,每次偏移就是一个char,也就是一个字节。
有了上述分析,之前的问题也就引刃而解了。
总结;正如书中所说,指针就是地址,问题是这地址代表的是什么意思?通过这个地址,我们能访问的内存空间中的内容是什么?