通过指针访问结构体中的指针

3

我正在阅读关于链表的内容,同时也在研究结构体。我有一个问题:

当我使用指向结构体的指针时,如何正确地访问结构体中的指针?

例如,我声明了如下结构体:

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。哪个是正确/唯一/适当/正确的做法?两种方法都可以吗?
1个回答

4
对于变量y的值,请使用pter->y,对于存储在y中的值,请使用*pter->y(等同于*(pter->y))。
注意:->运算符的优先级高于解引用运算符*,因此*pter->y == *(pter->y)
编辑:根据评论。
表达式pter-> *y应该是语法错误,因为由于以下原因它不能是有效的表达式:
  1. 如果将*解释为一元解引用运算符并应用于y,则y是未知的变量名(没有pter)。
  2. 如果将*视为乘法运算符,则->不能出现在*之前。
因此,在两种方式下都会产生编译错误。

1
我好像无法理解优先级的概念以及它在这里是如何工作的。为什么不能/不应该是:pter>*y - Rivasa
看到 pter-> *y,那么 (1) 如果应用于 y 的是 *,那么 y 就是未知的(没有 pter)(2) 如果 * 用作乘法运算符,则 -> 不能出现在 * 之前。因此,在两种情况下都会出现编译错误。 - Grijesh Chauhan
@Link 懂了吗?还是我需要在回答中解释一下。 - Grijesh Chauhan
我建议为了后人的阅读方便和更容易阅读而编辑答案。但是我会接受这个答案。 - Rivasa
@Link 我在这里进行测试,它会给出“'error: expected identifier before '*' token'”的错误信息。因此,在您的表达式中,*被GCC编译器解释为*,因为它接受一个有效的操作数标识符在*之前(根据错误消息)。请注意:在不同的编译器中,产生的错误消息可能会有所不同。了解语言标准可以告诉我们什么是有效的语法。但不会说任何关于应该是什么编译器消息的内容。这取决于编译器(更好的编译器会给出更好的消息)。尽管错误消息应该是从用于描述语法的语法中推导出来的。 - Grijesh Chauhan
@Link 你了解移进-规约分析器吗? - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接