结构体、共用体和用户定义类型
结构体类型
类型定义
struct [struct_name] { type1 member1; type2 member2; /* ... */ typen membern; }
- "struct [struct_name]"作为一个整体与C语言基本数据类型具有同样的地位和作用。
- 花括号中的结构体成员定义了此结构体内每一个成员的类型,它们组成了一个结构体。
- 结构体成员类型既可以是基本数据类型,也可以是构造类型或指针类型。
变量定义
先定义结构体类型,再定义结构体变量
/* 先定义结构体类型 */ struct [struct_name] { struct_members; } /* 再定义结构体变量 */ struct struct_name struct_var1 struct_var2 struct_varn;
在定义结构体类型的同时定义结构体变量
/* 结构体类型和结构体变量同时定义 */ struct [struct_name] { struct_members; } struct_var1,struct_var2,struct_varn;
在定义结构体类型时省略结构体名称,直接定义结构体变量
/* 匿名结构体 */ struct { struct_members; }struct_var1,struct_var2,struct_varn;
匿名结构体的定义中,结构体变量是必须存在的,并且不能在程序中的其它地方再定义相同类型的其他结构体变量。
变量初始化
初始化数据的数据类型即顺序要和结构体类型定义中的结构体成员相匹配。
如果初始化数据中包含多个结构体成员的初值,则这些初值之间要用逗号分隔。
可以同时对多个结构体变量进行初始化,它们之间也是用逗号来分隔。
C语言规定,不能跳过前面的结构体成员而直接给后面的成员赋初值,但可以只给前面的成员赋初值。此时未赋值的成员由系统根据其数据类型自动赋0(int)或‘ '(char)或NULL(指针)。
/* 定义结构体类型日期 */ struct date { int year; int month; int day; }; /* 定义结构体类型学生,嵌套结构体类型日期 */ struct student { char num[10]; char name[20]; char sex; struct date birthday; float score; }; /* 初始化结构体类型变量 */ struct student stud1={"20200901","harry potter",'F',{1992,10,8},99};
变量引用
使用成员运算符(.)来进行结构体变量的引用,它在所有运算符中优先级最高。
/* struct_var.struct_mem */ struct student stud1={"20200901","harry potter",'F',{1992,10,8},99}; printf{"%d",stud1.score};
结构体数组
/* struct struct_name struct_array[constant] */ struct student std[10];
结构体指针
/* struct struct_name *struct_point */ struct student *ps; /* 通过指针变量引用结构体成员-成员运算符 */ printf("%d",(*ps).score); /* 通过指针变量引用结构体成员-指向成员运算符 */ printf("%d",ps->score);
共用体类型
共用体又称联合体,其含义是多个数据成员共用一段内存空间。这些分配在同一段内存空间的不同数据在存储时采用相互覆盖的技术。
例如,如果有一个整型变量、一个字符型变量和一个实型变量在程序中不是同时使用,则可把这3个变量放在同一个地址开始的内存空间中,由于这3个变量所占内存的字节数都不相同,所以这段内存空间的长度以其中最大变量的存储空间为准。由于这三、几个变量从同一个地址开始存放,所以这个几个变量间只能是相互覆盖,系统将保留最后一次赋值的内容。
类型定义
union [union_name] { type1 element1; type2 element2; /* ... */ typen elementn; };
变量定义
同结构体变量定义
变量引用
同结构体变量引用
枚举类型
在实际应用中,有些变量的取值被限定在一个有限的范围内,例如一周有七天,一年有十二个月。
这种在变量定义时能将此变量所有可能的取值一一列出的情况称为枚举,C语言专门设置了一种枚举类型来描述这种类型。
类型定义
/* define */ enum [enum_name] {enum_values}; /* example */ enum weekday {sun,mon,tue,wed,thu,fri,sat};
- 枚举值是常量,不是变量。不能对枚举值赋值。
- 枚举元素本身由系统定义了一个表示序号的数值,从0开始,这被称之为隐式定义。
- 可以对枚举值的序号进行显式定义,指定某一枚举元素的序号,如果有未指定值的枚举元素,则根据前面枚举元素的值一次递增1。
- 只能把枚举值赋给枚举变量,不能把枚举元素的序号赋给枚举变量。
typedef定义类型
C语言中,除了可以直接使用C系统提供的标准类型及构造类型外,还可以使用typedef来为已有的类型定义新的类型名。
typedef定义的新类型实际上是为已有的类型重命名,它并不产生新类型。
typedef类型定义
typedef old_name new_name; typedef int INTEGER; /* 定义了两个整型数组 a[80]和b[80] */ typedef int ARRAY[80]; ARRAY a,b;