use*_*809 3 c syntax struct pointers operators
结构体指针的使用非常频繁,因此有一个特殊的运算符:->。下面的表达式是等价的:
(*x).y
x->y
Run Code Online (Sandbox Code Playgroud)
将此运算符简单地视为如下定义的预处理器宏是否公平:
#define (x)-> (*(x).)
为什么或者为什么不?或者它从一开始就被编码为运算符 - 这有何不同/优势?
只是好奇。
下面的表达式是等价的:?
(*x).y
x->y
Run Code Online (Sandbox Code Playgroud)
是的,两者是访问结构成员的两种不同方式y
。
(*x).y
运算符是.
与值变量一起使用的 DOT Element selection by reference
。即所使用的原因*
。meansx
是指向结构体的指针。
x->y
使用的运算符->
称为Element selection through pointer
. 这与指向结构的指针一起工作。*
这就是这次没有使用的原因。
两者工作原理相同。
将此运算符简单地视为如下定义的预处理器宏是否公平:
#define (x)-> (*(x).)
Run Code Online (Sandbox Code Playgroud)
否 首先它给出一个错误: 宏名称必须是标识符。这个错误是因为我们不能将->
运算符作为宏名称。
有效的宏名称可以是:
宏名称只能由字母数字字符和下划线组成,即“az”、“AZ”、“0-9”和“_”,并且第一个字符不应是数字。某些预处理器还允许使用美元符号“$”,但您不应该使用它;不幸的是我不能引用 C 标准,因为我没有它的副本。
另外,请注意->
和.
是差异运算符,正如我上面所述。它们的优先级也不同,因此将一个运算符替换为另一个运算符是个坏主意。
访问结构元素的有效宏:
另外我想分享今天我才知道的大多数C 头文件。定义的宏如:
#define S(x) ((x).y)
Run Code Online (Sandbox Code Playgroud)
对于特定的 strcut 元素。
注意(x)
括号x
是为了覆盖*
over的优先级.
。默认情况下,.
DOT 具有更高的优先级*
,因此它可以用于指针和简单变量。我认为下面我的例子会有帮助。
#define S(x) ((x).y)
typedef struct {
int y;
}X;
X *x;
X b;
int main(){
S(*x);
S(b);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
更好的选择
我正在扩展我的想法来访问 strcut 元素,我定义了新的宏:
#define S(x,y) ((x).y)
typedef struct {
int a;
}X;
X *x;
X b;
int main(){
S(*x,a);
S(b,a);
}
Run Code Online (Sandbox Code Playgroud)
不是它更多的是通过宏来指定元素。
希望至少OP喜欢它:)