在C语言中两种结构体定义及变量声明写法是否等价?
两种C语言结构体写法的差异解析
嘿,这个问题问得太戳痛点了!我刚学C语言的时候也被这种写法绕晕过,咱们直接把这两种写法的本质差异说清楚——它们语法都合法,但功能和适用场景完全不一样,可不是等价的哦!
写法一:匿名结构体 + 直接定义变量
struct{ int age; float height; }person1,*personPtr;
- 这行代码干了两件事:定义了一个没有名字的匿名结构体类型,同时直接创建了该类型的变量
person1和指向该类型的指针personPtr - 最大的限制是:这个结构体没有“身份标识”,之后你没法再用这个结构体类型去定义新的变量了!比如你之后再写
struct { int age; float height; } person2;,这其实是一个全新的匿名结构体,和person1的类型并不相同(哪怕成员完全一致),两者不能互相赋值或者兼容使用 - 适合场景:只需要一次性创建几个该类型变量,之后再也不用扩展的简单场景
写法二:具名结构体 + 单独定义变量
struct person{ int age; float height; }; struct person person1; struct person *personPtr;
- 这组代码是标准的“先定义结构体类型,再用类型创建变量”的写法:
- 首先定义了一个有名字的结构体类型
struct person,相当于给这个结构体模板起了个名字 - 然后用这个类型分别创建了变量
person1和指针personPtr
- 首先定义了一个有名字的结构体类型
- 优势非常明显:因为类型有名字,之后你可以随时用
struct person来创建更多同类型的变量、指针,比如struct person person2; struct person *p = &person2;,这些变量都属于同一个结构体类型,完全兼容,代码可读性也更高 - 如果想简化写法,还可以配合
typedef:
这样就可以用typedef struct person { int age; float height; } Person; Person person1; Person *personPtr;Person代替struct person来定义变量了,更简洁
总结
- 写法一:一次性使用的匿名结构体,用完就没法复用类型
- 写法二:可复用的具名结构体,适合需要多次使用该类型的场景,是实际开发中更常用的写法
内容的提问来源于stack exchange,提问作者brown_dorito
相关产品推荐
相关产品推荐

