为什么我不能添加指针?

时间:2010-05-29 12:36:13

标签: c++ pointers

我的代码与此非常相似:

LINT_rep::Iterator::difference_type LINT_rep::Iterator::operator+(const Iterator& right)const
{
    return (this + &right);//IN THIS PLACE I'M GETTING AN ERROR
}

LINT_rep::Iterator::difference_type LINT_rep::Iterator::operator-(const Iterator& right)const
{//substracts one iterator from another
    return (this - &right);//HERE EVERYTHING IS FINE
}

err msg: Error  1   error C2110: '+' : cannot add two pointers

为什么我只在一个地方而不是两个地方都收到错误?

7 个答案:

答案 0 :(得分:53)

742 Evergreen Terrace + 1 = 743 Evergreen Terrace

742 Evergreen Terrace - 1 = 741 Evergreen Terrace

743 Evergreen Terrace - 741 Evergreen Terrace = 2

743 Evergreen Terrace + 741 Evergreen Terrace = ???

答案 1 :(得分:38)

在C ++中禁止指针添加,你只能减去两个指针。

这样做的原因是减去两个指针给出了逻辑上可解释的结果 - 两个指针之间的内存偏移量。类似地,您可以从指针中减去或添加整数,这意味着“向上或向下移动指针”。添加指针指针是很难解释的。结果指向者会代表什么?

如果您明确需要指向内存中地址为其他两个地址之和的位置的指针,则可以将两个指针强制转换为int,添加int s,以及扔回指针。但请记住,这个解决方案需要非常关注指针算法,这是你真正不应该做的事情。

答案 2 :(得分:3)

减去两个指针可以得到它们之间的距离。添加两个指针的结果是什么?

答案 3 :(得分:2)

我想在你的例子中,你期望的结果是添加或减去指向要移动的偏移量的指针,而不是另一个指针。

在C ++中,您可以减去2个指针(在它们之间获取内存中的偏移量)或添加指向整数值的指针(将指针移动到另一个内存位置,增加值* sizeof(object_class))。只添加2个指针在C ++中没有意义,但如果您确定要添加2个内存位置地址,则只需添加为无符号整数值(使用类型转换)。

答案 4 :(得分:2)

其他答案已解释为什么,你正在做的事情不起作用,但我的猜测是,你想为迭代器定义典型的operator+,但在这次尝试中迷失了。

指针和标准随机访问迭代器都允许通过整数值推进指针或迭代器。在迭代器的情况下,定义了operator+,它将一个整数值作为参数并返回一个迭代器。

LINT_rep::Iterator LINT_rep::Iterator::operator+(int distance) const;

您可以将此类运算符定义为方法,但此方法将允许您编写

iterator + distance

但不是

distance + iterator

使加法可交换你必须定义一个朋友非成员函数,它将距离作为第一个参数,迭代器对象作为第二个参数

friend LINT_rep::Iterator LINT_rep::Iterator::operator+(int distance, const  LINT_rep::Iterator & rhs);

答案 5 :(得分:0)

  

为什么我在一个地方而不是两个地方都犯了错误?

即使你被允许添加两个指针,这个:

 return (this + &right);

无处可指。想一想 - 这个可能是0x00123456,& right 将在同一范围内(0x00000000..0x80000000 - 例如0x00321321)。如果你把它们加起来,结果地址将指向离两个变量都很远的地方(0x00123456 + 0x00321321 == 0x00444777,这将远离“this”和& right),你可能会进入保留内存(0x8xxxxxxx)在胜利),等等,指针可能会溢出。这可能是(为什么)被禁止的原因。

如果要向指针添加内容,请添加整数。

答案 6 :(得分:0)

假设您有2个指针,并且您知道其中一个或两个都为空。您希望返回非null或null,以防两者都为null。最简单的方法是对它们进行求和。这是求和指针的唯一案例。