一、复合类型与结构体类型
根据语法规则由基本类型组合而成的类型称为复合类型。结构体则是由struct、复合类型、自定义标识符(在C语言中称为Tag)和;构成。比如:struct complex_struct{int x,y};注意不管是定义了变量如图1-2所示,还是只定义了Tag如图1-1所示,声明都要以“;”结束。
书写结构体有三种方式:
1.定义结构体类型的时候同时定义了变量如图1-2所示。这种情况下有时可以省略Tag.例如:
struct{
double x,y;
}z1,z2;
但是这样就没有办法引用结构体类型了,因为它没有名字。每一个结构体都是有若干成员组成,我们可以用变量名加运算符“.”来访问。例如下图:
图1-2定义和访问结构体
2.结构体定义在全局作用域中,这样定义的Tag在其定义之后的各个函数中都可以使用。如图1-1;
图1-1 定义和访问结构体
结构体变量也可以在定义时初始化,例如:
struct stu boy1={20,"丽萨","女"};
初始化的数据依次赋值给结构体中的各成员。如果初始化中的数据比结构体的成员多,编译器则会报错,但如果只是末尾多个逗号则不算错。如果初始化中的数据比结构体的成员少,未指定的成员将用0来初始化。以下几种形式的初始化都是合法的:
int age=14;
struct stu boy1={age,"丽萨","女"};/*boy1.age=14,boy1.name=丽萨,boy1.sex=女*/
struct stu boy1={"丽萨","女"};/*boy1.age=0,boy1.name=丽萨,boy1.sex=女*/
注意,boy1必须是局部变量才能用另一个变量age的值来初始化他的成员,如果是全局变量,则只能用常量表达式来初始化。无论是初始化全局变量还是局部变量{}这种语法不能用于结构体的复制。例如:
struct stu boy1;
boy1={20,"丽萨"," 女"};
结构体类型在表达式中有很多限制,不像基本类型那么自由。例如+、-、*、/等算术运算符和&&、||、!等逻辑运算符都不能做用于结构体类型,if语句,while语句中的控制表达式的值也不能是结构体类型。结构体变量之间使用赋值运算符是允许的用一个结构体变量初始化另一个结构体变量是允许的,例如:
struct arry_struct {double x,y}; --------1
struct arry_struct z1={3.0,4.0}; --------2
struct arry_struct z2=z1; --------3
z1=z2; --------4
同样的z2必须是局部变量才能用变量z1的值来初始化。既然结构体变量之间可以相互赋值初始化,也就可以当作函数的参数和返回值来传递:(上例定义的arry_struct这个Tag以后都可以直接用strct arry_struct来代替类型名。例如第二行,第三行).