c++ - 指针运算 : how are these statements different?

标签 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;
}

不管这些语句实际计算的是什么,我不明白为什么这些操作看起来与编译器不同。 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 是您拥有的唯一正确/有意义的代码。 median1 在语法上是正确的,但等同于 median = startnode,这可能不是您想要的。

关于c++ - 指针运算 : how are these statements different?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390227/

相关文章:

ios - Realm 用 Swift 4.0 编译的 Swift 模块无法在 Swift 4.0.2 中导入

无法运行使用 gcc (minGW) 编译的 .exe 文件

c++ - 需要以合理的精度创建自定义数据 2D 纹理

c++ - 从 ipv4_address 构造 ip::address

c++ - 可以使用 pop_back 从 vector 中删除某些值吗?

c++ - 如何为模板类型创建别名?

ios - 通过另一个类以编程方式将对象添加到 xib 文件

ios - HealthKit Watchos - 计算速度或 'Pace'

c - linux交叉编译的方法

c - 在 procfs.h 中找不到 pstatus_t (LINUX)