从面试题入手,分析不同指针类型的区别

描述

如果你不太清楚int *和char *的区别,看完这道题,可能就会有所感悟。

数组

一个字符数组a,初始化成:

0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 然后定义三个指针,分别是:

short * int * int64 *这里把 int64 理解成 8 个字节的整数就行,不用管它是不是真的存在。

三个指针都初始化成数组名a,也就是数组第一个元素的地址,假设数组首元素地址是 0x100,那三个指针的值都是 0x100。

如果画出来,就是这样的。

数组

下面就要来搞清楚 short * 和 int * 的区别。

所谓short *,表示一个指针,指向的是short类型的数据。在32位系统中,short类型占2字节,所以指针指向的是这两个字节。如果让指针加一,它也会跳过两个字节。

同理,如果是int *类型,也表示一个指针,指向int类型的数据,在32位系统中,int类型占4字节,所以指针指向的是这4个字节,如果让指针加一,他也会跳过4个字节。

再回到数组上,因为三个指针类型不同,所以指向的数据长度也不同。

接下来就是取值操作。

数组

*p1就是取指针 p1 指向内存的值,但是并不能简单的认为结果是0x0102。也有可能是0x0201。

还好题目一开始说了,32位系统,小端字节序。

数组

所谓小端,就是高地址保存高字节。

在数组里面,下标为 0 的元素一定是低地址,所以01应该就是低字节。

于是 *p1 是 0x0201。

数组

*(p1 + 2)应该会跳过4个字节,刚才说了,short *类型的指针,加一会跳过2个字节。所以*(p1 + 2)的结果是0x0605。

p3因为指向了8个字节,所以*p3是0x0807060504030201。

数组

最后一个*(p2 + 2),p2是int类型的指针,加2跳过了8个字节,表示的是最后4个字节的地址,取值的结果就是0。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分