指针与下标计算

差一错误是所有程序员的噩梦!

它看起来是一个琐碎的问题,却非常烦人,许多程序员对它是采取一种“轻蔑”的态度,即使被它虐了千百遍,还是不愿意正视这个问题。

其实,差一问题并不是一个小问题,我们应该对它给予足够的重视。

在《C陷阱与缺陷》中,对这个问题有详细的讨论,这里结合我的理解写一写解决这个问题的方法。

 

许多程序员在遇到差一问题时,常常采用的是“探测法”,一个位置应该写n还是应该写n-1,测试两次就够了,如果是两个位置,就要测试四次,三个位置,要测试八次。。。

其中还可能存在“重叠错误”,当有两个错误时,测试是正常的,当改正了一个错误,反而测试出错。

一次过写一段正确的代码,总比飞快得写一堆糟糕代码,再做一天debug好得多。

 

正确的指针和下标,是计算出来的,不是乱蒙出来的!

 

 

指针运算

在学会计算指针之前,先要正确理解数组和指针。

 

首先,地址就是一个整数,不是什么神奇的东西!

指针是地址变量,数组名是地址常量。

 

举个例子,

int arr[10];

编译器会分配10个整型大小的空间,首地址是arr,假设arr=500,那么这个数组就是这样的:

 

其中能索引到的元素是arr[0]arr[9],arr[n]也就是arr[10]是没有的。

arr[0]有,arr[n]没有,这个叫“不对称边界”,它带来极大便利的同时,也引起了许多错误,不过,这种设计绝对是正确的。

可以用arr+5,表示第5个元素的地址(从0开始),但是不允许arr=arr+5,因为数组名是个常量。这里arr=500,arr+5不等于505,而是等于520&#x

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值