1、构造数据类型:
之前我们学习了基础数据类型(int、double、float、char等),数组类型、指针类型,这些都属于简单数据类型,而C语言支持使用基本数据类型构造出新的复合数据类型。
2、结构类型定义、声明:
对于有些数据,它是由若干不同类型的数据成员组合而成的一种复杂的构造型数据,而数组只允许存储相同类型的数据;多个数组之间不能建立关联关系;的局限性决定了需要创建一种新的复合数据类型来存储复杂类型的数据,因此,结构类型应运而生。(结构类型属于值类型)
定义结构类型:
struct 结构名称
{
数据类型结构成员1;
数据类型结构成员2;
… …
}; 例如:
1 struct pupil 3 { 4 int num; 5 char name[20]; 6 char sex; 7 float score; 8 //… … 9 };
结构定义不预留内存,只是标识出连续区域,以便将来存储不同类型数据;
结构定义一般置于程序头文件声明之后;
使用结构之前需要先声明结构变量,声明结构变量将会为该变量分配内存,大小大于或等于其所有成员变量的大小之和(sizeof);格式如下:
struct 结构名称结构变量;
例如:struct pupil p1, p2;
另外,我们还可以嵌套的方式使用一个结构体构建另一个结构体,示例如下://但是不能使用一个结构体嵌套这个结构体它本身。
1 struct date 2 { 3 int year; 4 int month; 5 int day; 6 } 7 8 构造: 9 struct pupil 10 { 11 int num; 12 char name[20]; 13 … 14 struct date birth; 15 … 16 }
3、访问结构成员、初始化、赋值:
访问结构成员,我们可以使用点运算符”.”来访问,格式:
结构变量.结构成员
例如:p1.num、p1.name、p1.score、p1.birth.year等;
我们可以通过直接赋值、访问结构成员的方式为结构赋值:
- 直接赋值的方式:p1 = {1,”Tom”,’M’,…,{1990,5,1},95.0,…};
- 访问结构成员赋值的方式:p1.num = 1; p1.name = “Tom”; p1.birth.year = 1990;
- 仅在初始化时赋值使用直接赋值的方式,除此之外只能使用访问结构成员的方式为结构赋值;
- 如果两个结构变量属于同一结构体类型,则可以直接进行结构体变量间赋值,即:p2 = p1;
4、结构指针访问成员:
- 当指针指向结构时,称之为结构指针变量;
- 结构指针变量指向结构的首地址;
- 结构指针变量声明: struct 结构名称 *结构指针变量名; 结构指针变量 = &结构变量;
- 结构指针变量访问成员: (*结构指针变量).结构成员 或者 结构指针变量->结构成员
5、结构类型的定义:
可以使用typedef来定义真实类型名,来替换声明结构的标记,例如:定义Part的类型:
1 typedef struct { 2 int number; 3 char name[LEN + 1]; 4 int on_hand; 5 } Part; //名称Part必须出现在定义的末尾,而非struct后边;
之后,我们可以像使用内置类型那样使用Part了,例如:
声明变量:Part part1, part2; Part是typedef的名字,之前无需书写struct。
1⃣️相当于通过typedef为结构体起了一个别名,可以直接使用别名表示结构体,无需struct关键字指示;
2⃣️结构数组:对于同为一种结构类型的多个数据,我们可以使用结构数组来存放这些数据。
6、枚举类型:
对于变量只有少量有意义的值我们可以用两种方式来表示:
- 使用#define宏定义
- 使用枚举
1 enum suit {CLUBS, DIAMONDS, HEARTS, SPADES}; enum suit s1, s2; 2 3 typedef enum { CLUBS, DIAMONDS, HEARTS, SPADES } Suit; Suit s1, s2; 4 //或者: 5 typedef enum {FALSE, TRUE} Bool; //typedef修饰时,可将枚举作为类型使用,之前不必加enum(同理struct的定义)
枚举可作为整数(默认从“0”开始顺序赋予整数值,有时需要定义枚举起始值):
1 enum suit {CLUBS = 1, DIAMONDS = 2, HEARTS = 3, SPADES = 4}; 2 3 typedef enum { CLUBS = 1, DIAMONDS, HEARTS, SPADES } Suit;