指针算术:这些语句有何不同?

Pointer Arithmetic: how are these statements different?

在 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;
}

不管语句实际计算的是什么,我不明白为什么这些操作看起来与编译器不同。 median 与 median4 有何不同,除了以 + 或 - 运算符开头? median2 和 median5 相同。如果 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'

...because that looks like two identical types to me.

对,但是添加指针是无意义的操作,所以语言不允许。减法就好了。

while median2 compiles, it does have a warning:

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

median3 是您仅有的 correct/meaningful 段代码。 median1 在语法上是正确的,但等同于 median = startnode,这可能不是您想要的。