【问题标题】:C - how do I read * and -> together? [closed]C - 我如何阅读 * 和 -> 一起? [关闭]
【发布时间】:2016-09-15 07:03:44
【问题描述】:

如果我有:

char *name; //this is in a struct

*row->name //row is able to get in the struct

我如何读取 *row->name 以及它返回的内容是什么?

我将链接我正在阅读的代码:http://pastebin.com/MvLXkDCz

【问题讨论】:

  • 它返回name指向的第一个元素。就像 row->name[0] 应该使用它来避免“混淆”。
  • @iharob 如果 name 未初始化,那么将传递给 sizeof(*row->name) 什么?
  • @don sizeof 在编译时仅使用类型信息进行计算。
  • @don 正如其他人所说,sizeof does not "evaluate" it's operand 所以不会发生任何不好的事情,这实际上是将大小传递给malloc() 的好方法,例如,出于多种原因。例如,如果您更改name 的类型,则不需要更改每个 malloc(),而且因为它总是正确的,所以它可以帮助您分配正确的大小。

标签: c pointers operators dereference


【解决方案1】:

首先评估-> 运算符,然后使用* 取消引用name 指向的结果指针。所以和

row->name[0]

恕我直言,这是一种更好的表达方式(虽然有时使用间接运算符 * 更清晰)。

【讨论】:

    【解决方案2】:

    -> 组件选择运算符的优先级高于一元运算符*,因此*row->name 被解析为*(row->name);您正在取消引用 row->name 成员。

    对于所有其他后缀1 运算符也是如此:

    *arr[i] == *(arr[i])
    *foo()  == *(foo())
    *a.p    == *(a.p)
    *p++    == *(p++)
    *q--    == *(q--)
    


    1. 组件选择运算符 `.` 和 `->` 与后缀运算符组合在一起,尽管它们看起来像中缀运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多