结构体指针运算符猜想(理论)

use*_*809 3 c syntax struct pointers operators

结构体指针的使用非常频繁,因此有一个特殊的运算符:->。下面的表达式是等价的:

(*x).y
 x->y
Run Code Online (Sandbox Code Playgroud)

将此运算符简单地视为如下定义的预处理器宏是否公平:

#define (x)-> (*(x).)

为什么或者为什么不?或者它从一开始就被编码为运算符 - 这有何不同/优势?

只是好奇。

Gri*_*han 5

下面的表达式是等价的:?

(*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喜欢它:)

  • 好吧,我不会提出任何想法,因为没有问题需要解决。:) 人们应该明确地使用“xy”。 (2认同)