指针算术:这些陈述有何不同?

时间:2015-02-08 03:25:08

标签: c++ ios c pointers xcode6

在IOS8.1,XCode 6.1.1中使用一些指针算法时,我遇到了编译器错误。经过调试后,我得到了以下代码片段,这些代码片段可以编译并排除不必要的代码。我不明白为什么编译器会以不同的方式解释它们:

struct kd_node_struct* find_median(struct kd_node_struct *startNode, struct kd_node_struct *endNode, int dimensionNumber)
{
    //these lines compile fine
    struct kd_node_struct *median = endNode - endNode + startNode;
    struct kd_node_struct *median2 = (startNode - endNode) / 2;
    struct kd_node_struct *median3 = startNode + ( (endNode - startNode) / 2);  

   //these lines give "invalid operands to binary expression" error
    struct kd_node_struct *median4 = endNode + endNode + startNode;
    struct kd_node_struct *median5 = (startNode + endNode) / 2;
}

无论语句实际评估的是什么,我都不明白为什么这些操作看起来与编译器不同。除了以+或 - 运算符前导之外,中位数与中位数4有何不同?中位数2和中位数5相同。如果median5失败,我真的不知道median3是如何编译的。

我发现错误信息特别令人困惑......

Invalid operands to binary expression('struct kd_node_struct *' and 'struct kd_node_struct *')

...因为对我来说这看起来像两种相同的类型。

我在这里缺少什么?

*编辑:当median2编译时,它确实有一个警告:

Incompatible integer to pointer conversion initializing 'struct kd_node_struct *' with an expression of type 'long'

1 个答案:

答案 0 :(得分:4)

  

...因为对我来说这看起来像两种相同的类型。

是的,但添加指针是一种荒谬的操作,因此语言不允许这样做。减法很好。

  

当median2编译时,它确实有一个警告:

是的,因为你已经创建了一个整数(指针差异除以2),并且你正试图用它初始化一个指针变量。

median3是您拥有的唯一正确/有意义的代码段。 median1在语法上是正确的,但相当于median = startnode,这可能不是你想要的。