【问题标题】:*((type *) x) vs (* (type *)x)? to cast into pointer and then dereference in C*((类型 *)x)与(*(类型 *)x)?转换为指针,然后在 C 中取消引用
【发布时间】:2017-03-26 00:17:08
【问题描述】:

要将变量 a[1] 转换为指针,然后在 C 中取消引用它,这两种格式似乎都有效。例如,

  1. *( (无符号整数 *) a[1])
  2. (*(unsigned int *) a[1])

它们都正确吗?它们之间有什么区别吗?

【问题讨论】:

  • 它们本身是等价的,但在实际代码中你必须警惕Operator Precedence。第二个选项(在我看来)会更好用,因为它在自己的表达式中进行取消引用,因此结果不受运算符优先级的影响,就像*((someStruct*)x)->ptr 这样的代码。
  • 为什么不直接*(unsigned int *)a[1]

标签: c dereference


【解决方案1】:

如果您将它们视为完全独立的表达式,或者如果右侧周围的上下文具有足够低的优先级(不会侵入表达式,因为它的优先级低于取消引用运算符 @987654321 @)。

否则,第二个版本在转换表达式周围有一对(),将其与周围的上下文“隔离”。例如,具有最高优先级的后缀运算符会对这两个表达式的语义产生不同的影响

*((unsigned int *) a[1])[M]
// Dereference is applied to the result of `[M]`

(*(unsigned int *) a[1])[M]  
// `[M]` is applied to the result of dereference

结果表达式不一定有效,但它们仍然说明了运算符-操作数分组的区别。例如。在整数M 的情况下,第一个表达式有效,第二个无效。如果是指针M,则相反。

【讨论】:

    猜你喜欢
    • 2016-04-18
    • 2020-12-22
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多