差一错误是所有程序员的噩梦!
它看起来是一个琐碎的问题,却非常烦人,许多程序员对它是采取一种“轻蔑”的态度,即使被它虐了千百遍,还是不愿意正视这个问题。
其实,差一问题并不是一个小问题,我们应该对它给予足够的重视。
在《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