以下表达式是等价的:?
(*x).y
x->y
是的,两者都是访问结构成员y 的两种不同方式。
(*x).y 运算符是 . DOT,它与值变量 Element selection by reference 一起使用。 * 使用的原因。表示x 是指向结构的指针。
x->y 运算符-> 被称为Element selection through pointer。这与指向结构的指针一起工作。这就是这次没有使用* 的原因。
两者的工作原理相同。
是否可以将此运算符简单地视为定义为这样的预处理器宏:
#define (x)-> (*(x).)
否首先它给出一个错误: 宏名必须是标识符。此错误是因为我们不能将 -> 运算符作为宏名称。
valid macro name 可以是:
宏名称只能由字母数字字符和下划线组成,即“a-z”、“A-Z”、“0-9”和“_”,并且第一个字符不能是数字。一些预处理器也允许使用美元符号'$',但你不应该使用它;不幸的是,我无法引用 C 标准,因为我没有它的副本。
另外,请注意-> 和. 是如上所述的差异运算符。它们的优先级也不同,因此将一个运算符替换为另一个运算符是个坏主意。
访问结构元素的有效宏:
另外我今天想分享一下,只有我知道大多数 C 头文件。定义的宏如:
#define S(x) ((x).y)
用于特定的 strcut 元素。
注意(x) 周围的括号x 将覆盖* 的优先级超过.。默认情况下. DOT 的优先级高于*,因此它可以用于指针和简单变量。我认为下面的示例会有所帮助。
#define S(x) ((x).y)
typedef struct {
int y;
}X;
X *x;
X b;
int main(){
S(*x);
S(b);
}
编辑:
更好的选择
我正在扩展我的想法以访问 strcut 元素,我定义了新的宏:
#define S(x,y) ((x).y)
typedef struct {
int a;
}X;
X *x;
X b;
int main(){
S(*x,a);
S(b,a);
}
对于通过宏的特定元素而言,这不是更多。
希望至少 OP 喜欢它 :)