【问题标题】:Accessing a pointer in a struct through a pointer通过指针访问结构中的指针
【发布时间】:2013-10-12 14:59:33
【问题描述】:

所以我在阅读邻接链表时​​一直在查看结构并想到了一个想法。

如何使用指向结构的指针正确访问结构中的指针?

例如,我有一个这样的结构声明:

typedef struct Sample{
    int x;
    int *y;
} Sample;

Sample test, *pter;  // Declare the struct and a pointer to it.
pter = &test;

所以现在我有一个指向结构的指针,我知道我可以像这样访问int x 中的数据:pter->x,这与此相同。但是,我无法选择/弄清楚如何通过指针访问*y

我的一个朋友说我应该这样做:*pter->y,但我认为这样做更有意义:pter->*y。哪种方法是正确的/唯一的/正确的/正确的?也许他们两个都可以吗?

【问题讨论】:

    标签: c pointers struct


    【解决方案1】:

    对于y 的值,使用pter->y,对于存储在y 的值,使用*pter->y(相当于*(pter->y))。

    注意:-> 运算符的 precedence 高于 * 取消引用运算符,这就是为什么 *pter->y == *(pter->y)

    编辑:根据评论。

    表达式pter-> *y 应该是一个语法错误,因为它不能是一个有效的表达式,原因如下。

    1. 如果* 被解释为一元解引用运算符并应用于y,则y 是未知变量名(没有pter)。
    2. 如果* 被视为乘法运算符,则-> 不能出现在* 之前。

    所以无论哪种方式编译都会产生错误。

    【讨论】:

    • 我不/似乎无法理解优先级的概念及其在这里的工作原理。为什么不能/不应该是:pter>*y
    • 参见pter-> *y then (1) * is if applied on y then y is unknown (without pter) (2) if * is used as multiplication operator then -> 不能出现在* 之前所以在这两种方式都是编译错误。
    • @Link 明白了,或者我应该在回答中解释一下。
    • 好吧,我建议为后代编辑答案,以便以后阅读。但我会接受答案。
    • @Link 我测试here 它给出了'error: expected identifier before '*' token',所以在你的表达式中* 被gcc 编译器解释为*,因为在* 之前接受一个有效的操作数标识符(根据错误信息)。注意:不同编译器产生的错误信息可能不同。理解语言标准告诉什么是有效的语法。但是不要说什么应该是编译器消息。这取决于编译器(更好的编译器会提供更好的信息)。虽然错误信息应该来自用于描述语法的语法。
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2011-02-03
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多