一、问题
在结构体中定义⼀个变量,可以有很多种⽅法,为什么这样定义编译出错呢?
例如:
struct persont{...};person a;
二、解答
在解答编译出错的原因之前,先要了解⼏种正确的定义结构体类型变量的⽅法。
(1)先声明,再定义。
上⾯问题中的代码也是先声明,再定义,但是在定义变量的时候没加关键字 struct,因此编译出错。正确的定义结构体变量的形式如下。
struct person {..);
struct person a,b;
struct person 为结构体类型名,a 和 b 为结构体变量名。在定义了结构体变量后,系统会为之分配内存单元。
(2)在声明类型的同时定义变量。
与(1)的例⼦作⽤相同,即定义了两个 struct person 类型的变量 a 和 b 。例如:
struct person {...}a,b;
该定义⽅式的⼀般形式为:
struct 结构体名
{
成员表列;
}变量名表列;
(3)直接定义结构体类型变量。
直接定义结构体类型变量就是没有出现结构体名,定义变量的⼀般形式为:
struct
{
成员表列;
}变量名表列;
掌握了上述正确定义变量的⽅法后,来分析⼀下为什么题中所述的定义⽅法是错的呢?
struct person{..} 实质上是声明了⼀个“结构标签”,即 person 只是这个结构体类型的⼀个标签,真正的类型名为 struet person。因此,在定义变量的时候,需要完整的类型名来定义,标签⽆法定义。
在了解了上述出错原因后,再来考虑⼀下下⾯的声明与结构体的声明有什么不同?
例如:
typedef struct {...}A;
结构体类型的声明实质上是声明了⼀个“ 结构标签 ”,⽽这个声明实质上是声明⼀个 “ 类型定义 ”。声明了⼀个新的类型名 A ,此时的 A 不是变量,⽽是⼀个此结构体类型的别名,它代表上⾯指定的⼀个结构体类型,这时可以⽤A定义⼀个变量,例如:
A a,b;
注意:
上述代码不要写成 struct A a,b; 的形式。
三、总结
在学习结构体时,要掌握并熟记定义结构体变量的⼏种⽅法,并理解结构体声明的实质意义。了解 typedef 的意思就是声明⼀个新的类型名代替已有的类型名。