看流星社区

 找回密码
 注册账号
查看: 1713|回复: 0

C++指针加整数、两个指针相减的问题

[复制链接]

该用户从未签到

发表于 2014-6-16 08:58:51 | 显示全部楼层 |阅读模式
说来惭愧,写C++有一段时间了。这个问题从来没有认真考虑过,此次标记于此:

考虑如下问题:
1     char a[20];
2     int *ptr = (int *)a;
3     ptr++;

第3句ptr++实际为ptr右移一个int空间(即4个字节)的距离,此时ptr指向a[4]。
若第3句改为
int *p = ptr + 2;
则p指向a[8]
这里说明当指针加整数时,指针向后偏移的距离看的是声明该指针的类型(此处即int),而非指向的实际类型(此处即char)!!!

另外,如果我就是想在第3句处得到a后面一个字节的地址怎么办?
可以这样:
void *p = a;
p = p + 1;
(这里注意:c++不允许p++或++p)

void类型的指针加整数,即为指针实际向后偏移的字节数。

同理,若
int *pa0 = (int *)&a[0];
int *pa4 = (int *)&a[4];
std::size_t s = pa4 - pa0;
则s等于1

那么如果
int *pa3 = (int *)&a[3];
int *pa5 = (int *)&a[5];
std::size_t s2 = pa3 - pa0;
std::size_t s3 = pa5 - pa0;
这里的s2,s3又分别等于多少呢,
是的,如你所想:s2等于0,s3等于1

可见,同类指针(当然也只有同类指针允许相减,如pa3和pa0)相减得到的整数值,等于两指针减的距离除以sizeof(声明指针的类型),然后取整(此处即static_cast<int>((pa3 - pa0) / sizeof(int)))。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-29 09:11

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表