C语言之指针(1)

第一次写博客,若有不当之处,请指出,谢谢。

最近忙于面试,对于指针有一点新的认识,写下感悟与大家分享。

面试题目,将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,也就是一个字节。

有了上述分析,之前的问题也就引刃而解了。

总结;正如书中所说,指针就是地址,问题是这地址代表的是什么意思?通过这个地址,我们能访问的内存空间中的内容是什么?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值