为什么指针算术不能在这里工作

Why is pointer arithmetic not working here?

本文关键字:在这里 工作 不能 指针 为什么      更新时间:2023-10-16

下面的程序

#include <iostream>
bool contains ( int * sarr, size_t n, int i ) // checks whether the integer i is in the sorted array sarr of length n
{ 
    int * pa = sarr; int * pb = sarr + n;
    if (pa == pb) return false; // empty array
    --pb;
    while (pa != pb)
    {
        if (*pa == i || *pb == i) return true;
        int * pc = (pa + pb)/2;
        if (*pc < i)
            pa = pc;
        else 
            pb = pc;
    }
    if (*pa == i || *pb == i)
       return true;
    else 
       return false;
}

int main () 
{
    int arr [] = {1, 1, 6, 10, 19, 22, 22, 22, 50};
    std::cout << contains(arr, sizeof(arr)/sizeof(int), 6); // should print 1
    return 0;
} 

我得到编译错误

error: invalid operands of types 'int*' and 'int*' to binary 'operator+'

在行

int * pc = (pa + pb)/2;

为什么?我认为添加指针是完全有效的。或者我需要在右侧做一些石膏吗?

我怎样才能使这个算法更紧凑和高效,同时继续覆盖所有的角落情况?

另外,我把它标记为C和c++,因为它是C风格的c++。

不允许添加指针。向指针(偏移量)添加整数值是有效的。你可以用(pb - pa) / 2 + pa来解决这个问题。