在K& R的第6章中,我们将通过指针访问结构的元素。我们有一个功能:
struct key *binsearch(char *word, struct key *tab, int n)
{
int cond;
struct key *low = &tab[0];
struct key *high = &tab[n];
struct key *mid;
while (low < high) {
mid = low + (high-low) / 2;
if ((cond = strcmp(word, mid->word)) < 0)
high = mid;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}
在我们未使用指针的此程序的早期版本中,我们可以将mid
计算为mid = (low+high)/2
,但现在我们需要将mid
计算为mid = low + (high-low) / 2
< / p>
我明白你不能添加指针因为逻辑上结果不会返回任何有用的东西,但我不明白的是我们还在添加mid = low + (high-low) / 2
的指针吗?我们将low
添加到(high-low)/2
的结果中?
答案 0 :(得分:0)
我弄清楚了我对逻辑的误解。当你减去两个指针时,结果是这两个指针之间的距离,可以添加到指针。
答案 1 :(得分:0)
示例中的指针只是指向一个数组,因此指针本身将按顺序编号(在它们指向的每个元素之间增加4或8个字节)。因此从低位中减去高位指针会得到数组的范围(以字节为单位)。将其除以2,然后将其添加到基础上以找到中点。它与通过索引数组这样做基本相同。
更有趣的问题是为什么数学逻辑逆转为:
mid = low + (high - low)/2; // Dealing with pointers
而不是:
mid = (low + high) /2; // Indexing an array using integers
快速回答:C语言禁止添加两个指针 GCC Error: Invalid operands to binary +
更长的回答: 添加(后一种方法)的问题是存在溢出数据类型的最大范围的风险。对于32位计算机(虽然写入K&amp; R时16位可能是常态)整数和指针的最大范围分别为+/- 20亿和4Gb。
对于索引数组,数组不太可能有超过几百万个条目,所以即使10,000,000 + 10,000,000也不会导致溢出。
然而,当处理指针时,你不会从0开始。你会从一个大数字开始分配一块内存。根据操作系统和编译器的不同,特别是在处理堆栈中的项目时,完全有可能在添加两个指针时,您可能会在32位范围内溢出,因此C不允许这样做,您需要减去指针。 / p>
答案 2 :(得分:0)
一种看待这种情况的方法是计算:
temp = ( high - low ) / 2
temp,一个整数值,是高指针和低指针之间距离的一半。
mid = low + temp
mid是低地址加上偏移量temp。 temp不是指针,而是索引量。
因此,此方法 NOT 添加两个指针。