K& R指针操作

时间:2013-09-06 15:23:35

标签: c pointers pointer-arithmetic

在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的结果中?

3 个答案:

答案 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 添加两个指针。