【问题标题】:Purpose of dereferencing a pointer as a parameter in C在 C 中取消引用指针作为参数的目的
【发布时间】:2011-02-03 05:19:31
【问题描述】:

我最近遇到了这行代码:

CustomData_em_free_block(&em->vdata, &eve->data);

我想,不是:

a->b

只是语法糖:

(*a).b

考虑到这一点,这一行可以重写为:

CustomData_em_free_block(&(*em).vdata, &(*eve).data);

如果是这样的话,传入有什么意义

&(*a),作为参数,而不仅仅是 a?似乎正在传入与 -(-a) 等效的指针,这有什么逻辑吗?

谢谢。

【问题讨论】:

    标签: c pointers indirection


    【解决方案1】:

    这个:

    &(*em).vdata
    

    和这个不一样:

    em.vdata
    

    同理:

    &((*em).vdata)
    

    & 符号取vdata 的地址,它是em 指向的结构的成员。 . 运算符的优先级高于 & 运算符。

    【讨论】:

    • 我同意独角兽部分。无论如何,这是有道理的。所以在这种情况下:(&(*a)).b 与:a.b 相同,但是没有额外的 () 来更改操作顺序,点积首先发生,对吗?谢谢。
    • @Leif Andersen:是的,(&(*a)) == a;这就是这两个运算符的含义。是的,. 的优先级高于&。不过,它不是点积 - 它是成员选择运算符。
    • @Leif Andersen:你可以用谷歌搜索 C 运算符的优先级;这是维基百科上的表格:en.wikipedia.org/wiki/…
    • 嗯...好的,谢谢。但是成员选择运算符仍然是用于从结构中获取特定变量的运算符,是吗? (我总是称其为点运算符,或者可能是点积,即使后者可能与数学中的向量混淆),感谢您让我了解这个符号。
    • @Leif:是的,它用于从结构中获取特定变量。可以将其称为“点运算符”,但不能称为“点积运算符”。
    【解决方案2】:

    以下是您所缺少的:&em->vdata&(em->vdata) 相同,而不是 (&em)->vdata。也就是说,它是em 所指向的结构的vdata 成员的地址。如果您查看 em 的类型,这应该很清楚 - 它是一个指针。

    是的,您总是可以将a_ptr->member 重写为(*a_ptr).member,但何必呢?这就是语法糖的重点。

    【讨论】:

      【解决方案3】:

      “如果是这样的话,传入&(*a)作为参数有什么意义,而不仅仅是a?”

      通常没有。但请注意,您的示例代码没有比较 &(*a) 和 a。您的示例代码比较了 &(*a) 和 b,其中 b 从 a 偏移了从 em 开始到 em 的 vdata 成员的距离。

      【讨论】:

        猜你喜欢
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 2014-01-03
        • 2019-05-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多