基本类型:整型、浮点型
复合类型:字符串
struct complex_struct{
double x,y;
};
定义了标识符 complex_struct,可以看作一个类型名。像 int 或 double 一样。 它是一个复合类型,而我们可以用这个复合类型来定义变量。
1 我们可以先定义一个结构体类型,然后再用这个结构体类型定义变量.(类型定义也是一种声明)
struct complex_struct{
double x, y;
};
struct complex_struct z1, z2;
2 我们也可以在定义结构体类型时就直接定义变量。
struct complex_struct{
double x, y;
} z1, z2; //定义complex_struct型的变量z1 z2。
初始化,我们可以有多种不同的方式,初始化时,如果{}内的成员比结构体的成员多,那么编译器 将会报错,正确的初始化方式可以有以下几种方法。
double x = 3.0;
struct complex_struct z = { 3.0, 4.0 }; //z.x = 3.0, z.y = 4.0
struct complex_struct z = { .y = 4.0 }; //z.x = 0.0, z.y = 4.0
struct complex_struct z = { x, 4.0, }; //z.x = 3.0, z.y = 4.0
struct complex_struct z = {3.0, }; //z.x = 3.0, z.y = 0.0
struct complex_struct z = { 0 }; //z.x = 0.0, z.y = 0.0
{} 大括号不能用来给结构体变量赋值,我们知道,C89允许在{}中使用常量表达式来初始化, 而用{}括起来的initializer并不属于表达式,所以不能用来赋值。 例如以下的做法是错误的
struct complex_struct z1;
z1 = { 3.0, 4.0 }; //{3.0, 4.0}这种并属于表达式,不能用于赋值
数据抽象简单的说就是"提取公因式":ab + ac = a(b + c)。如果a变了,ab 和ac 这两项都需要 改,但如果写成a(b+c)的形式就只需要改其中一个因子。
enum coordinate_type { RECTANGULAR, POLAR };
struct complex_struct {
enum coordinate_type t;
double a, b;
}
enum 关键字的作用和struct关键字类似,把coordinate_type 这个标志符定义为一个枚举类型。 枚举类型的成员是常量,他们的值由编译器自动分配,例如定义了上面的枚举类型之后,RECTANGULAR 就表示常量0,POLAR表示常量1,如果不希望从0开始分配,可以如下定义
enum coordinate_type { RECTANGULAR = 1, POLAR }; //这样的话,RECTANGULAR就表示1,
//而POLAR表示2。
结构体的成员名和变量名不在同一个命名空间中,但枚举的成员名却和变量名在同一个命名空间中, 所以会出现命名冲突。 例如 这样是不合法的
int main(void) {
enum coordinate_type { RECTANGULAR = 1, POLAR };
int RECTANGULAR; //这里的整型变量RECTANGULAR的命名 和枚举成员 RECTANGULAR命名
//冲突,不能这样写
printf("%d %d\n", RECTANGULAR, POLAR);
return 0;
}
查找数据抽象的例子,并思考如何做数据抽象才更加的合理。
结构体是一种递归定义,它的成员也具有某种数据类型,而结构体本身也是一种数据类型,也就是 说结构体成员可以是另外一个结构体,也就是说,结构体可以嵌套定义。
struct segment {
struct complex_struct start;
struct complex_struct end;
};
初始化时也可以嵌套初始化
struct segment s = {{ 1.0, 2.0 }, { 4.0, 6.0 }};
struct segment s = { 1.0, 2.0, 4.0, 6.0 };
struct segment s = {{ 1.0, 2.0 }, 4.0, 6.0 };
struct segment s = { .start.x = 1.0, .end.x = 2.0 }; //C99特性
访问嵌套结构体的成员:
s.start.t = RECTANGULAR;
s.start.a = 1.0;
s.start.b = 2.0;