为什么指针算术不能在这里工作
Why is pointer arithmetic not working here?
下面的程序
#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
来解决这个问题。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么thread_local变量在这里从未初始化?
- 移动语义在这里如何工作?
- 如何使用模板生成整数序列在这里工作
- 为什么sizeof函数在这里不能正常工作
- 无法让我了解 cin.get 和 cout 在这里的工作方式
- enable_if为什么不在这里工作?
- 为什么单例在这里工作,尽管静态变量被重新初始化为 NULL
- 右值参考在这里是如何工作的
- 继承在这里是如何工作的
- 无法理解静态概念在这里的工作
- 我在这里滥用了指针吗?虽然循环条件似乎无法正常工作
- 为什么istream,ostream,iostream,ios_base都在这里工作
- 返回参考资料在这里是如何工作的
- c++数据成员.目标:在构造函数中初始化,然后不管,将const工作在这里
- static_cast - 为什么它在这里工作
- 为什么指针算术不能在这里工作