关于指针中加减法计算的问题

在c语言中,我们知道,指针就是数据存储在内存中的编号。

我们可以通过访问这个编号来获取存储在内存中的数据。

指针的大小是固定的,在32位机器中,指针的大小是4个字节,64位机器中,指针的大小是8个字节。

而在我们在对指针进行加减法运算时,我们会发现有时候它们的就算并不是我们数学上的1+1=2

那么我们就来举例子说明一下

00000040774FFCF4
00000040774FFCF8
00000040774FFD14
00000040774FFD15

这是我们从图中获得的数据

可以发现,对a的地址进行+1时,数值确增大了4,而对b的地址加1时,数值只增大了1。

那么其中是否有什么规律呢?

其实这是根据被取地址的变量的类型来决定的,在c语言中(其他语言我不清楚,可以自己探索一下)我们可以得到如下公式:
                

                     运算后的地址=运算前的地址+(-)操作数*被取地址数据的类型的大小

前文中的例图已经验证了我的结论,那么我们现在来想想为什么它会这样去运算呢?
拿int类型的数据举例

可以看到我们打印出了1,2

而如果按照我们的常理来说,arr+1之后只是跳过了一个字节,而并不能跳过四个字节,所以得到的结果理应不是2而是0,因为2在内存中的表达形式其实是00 00 00 02(其中每2个0是一个字节),而2的前一个数据是1,可以写成00 00 00 01。而如果在1之后访问2,我们首先访问到的其实是00,如果我们只访问一个字节,那么我们就无法得到完整的数据。那如果是+1的话就跳过4个字节呢,我们刚好就能完全访问下一条数据,这样其实也就可以方便我们编程时的各种操作。

有的人会问,那地址-地址得到的结果又是什么呢,地址+地址得到的结果又是什么呢?
我们不妨写一串代码来探索一下

可以看到地址-地址得到的结果是两个地址间元素的个数

那咱们讨论一下地址+地址的意义

其实我们仔细想想,7月31日-7月18日=13日,

那7月31日+7月18日有什么意义呢,那显然是无意义的

其实地址+地址也和这个道理一样,实际上是没有什么意义的。

那么,本期的文章就到这里结束,有什么不足的地方欢迎大家补充,有什么错误也希望大家能够指出,感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值