指针加减运算的坑

今天面试遇到了指针的运算,题目是这样的:

unsigned long* A = (unsigned long*)0x800050 + 5;

unsigned char* B = (unsigned char*)0x800050 + 5;

问 A和B各是多少?

我心想这不就是10进制运算吗,立马写上答案0x800055丶0x800055。写完感觉不对劲,这也太简单了吧,面试会出这么愚蠢的题?

然后我才发现是指针的加法...我们都知道指针加1是指向下一个元素地址,这个地址不是简单前一个元素的地址加1,因为元素是有大小的,需要预留位置给前一个元素。如unsigned long* A = (unsigned long*)0x800050 + 5就相当于A=0x800050 + 4*5=0x800064。说白了就是指针的加减运算是重载了的,伪代码如下

pointer operator + (int count){
    *this += sizeof(pointer_type)*count;
    return *this;
}

pointer operator - (int count){
    *this -= sizeof(pointer_type)*count;
    return *this;
}

搞懂了之后,题目的答案就是A=0x800064,B=0x800055

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值