C语言中s.numbers.(*swag).description编译报错?等价语法失效原因
为什么用
(*x).y等价替换->时编译出错? 这问题我刚啃C语言结构体和指针的时候也踩过一模一样的坑!咱们先把你的代码摆出来,再一步步拆解问题:
typedef struct { const char *description; float value; } swag; typedef struct { swag *swag; const char *sequence; } combination; typedef struct { combination numbers; const char *make; } safe; int main() { swag gold = {"GOLD!", 1000000.0}; combination numbers = {&gold, "6502"}; safe s = {numbers, "RAMACON250"}; // 正确写法 printf("Result: %s \n", s.numbers.swag->description); // 错误写法(编译报错) // printf("Result: %s \n", s.numbers.(*swag).description); return 0; }
错误根源:搞混了「成员名」和「指针变量」的身份
->运算符的本质确实是(*指针变量).成员的语法糖,但这里的关键是:指针变量必须是一个实际的指针值,而不是结构体成员的名字。
你的错误写法里,swag是combination结构体里的成员名(类型是swag*),但你直接写(*swag),编译器会把swag当成一个独立的变量名去查找——可你根本没定义过叫swag的变量啊!这就是编译器报error: expected identifier before '(' token的原因:它找不到名为swag的标识符,自然无法处理括号里的解引用操作。
正确的等价写法
你需要把整个指针成员s.numbers.swag作为解引用的对象,而不是单独的成员名swag。正确的替换写法应该是:
printf("Result: %s \n", (*s.numbers.swag).description);
这里还要注意运算符优先级:.的优先级比*高,所以必须给*s.numbers.swag加上括号,否则编译器会错误地解析成*(s.numbers.swag.description)——这显然不是你想要的,因为swag.description根本不是指针类型。
再总结下等价关系
s.numbers.swag->description ≡ (*s.numbers.swag).description
两者完全等价,只是前者是语法糖,写起来更简洁而已。
内容的提问来源于stack exchange,提问作者G.V.
相关产品推荐
相关产品推荐

