第十章 结构体与共用体
§10.1 概述
有时需要将不同类型的数据组合成一个有机的整体,如:一个学生的基本情况:学号(int num),姓名(char name[20]),性别(char sex),年龄(int age),成绩(float score),地址(char addr[30])
C语言提供了这样一种数据结构,称为结构体。 结构体定义的一般形式: struct 结构体名 { 成员表列 }; 或称“域表” 如:一个学生的基本情况可定义如下 struct student
{ int num; 2字节 char name[20]; 20字节 char sex; 1字节 int age; 2字节 float score; 4字节 char addr[30]; 30字节 };
59字节
§10.2 定义结构体类型变量的方法
三种方法:
一.先定义结构体类型,再定义变量:
struct student
{ int num; char name[20]; char sex; int age; float score; char addr[30]; };
struct student stu1,stu2;
注意:struct student 是一个整体来定义结构体变量的。
二.在定义类型的同时定义变量
struct student
{ int num; char name[20]; char sex; int age; float score; char addr[30]; } stu1,stu2;
三.直接定义结构体类型变量
struct
{ int num; char name[20]; char sex; int age; float score; char addr[30]; } stu1,stu2; 说明:
1.成员也可以是一个结构体变量。如:
struct date { int month; int day; int year;
};
struct student1 { int num;
char name[20]; char sex; int age;
struct date birthday; char addr[30]; } stu3; birthday num name sex age month day year
2.成员名可以与程序中的变量名相同。
addr §10.3 结构体类型变量的引用
对结构体变量的引用,一般是分别引用其成员,引用方式为: 结构体变量名.成员名 (由此可与函数中同名的变量区分) 如: stu1.num , stu1.age
其中“.”为成员运算符,它在所有的运算符中优先级最高。 若成员的类型又是一个结构体,则要用多个成员运算符: stu3.birthday.year (只能对最低级的成员进行赋值或存取及运算) 成员变量与一般的变量是一样的。如: I/O操作:
scanf(“%d”,&stu1.num); printf(“name=%s\\n”,stu1.name); 赋值操作:
stu2.age=25; stu3.age=stu2.age; stu1.age++; stu3.birthday.day++;
在有些系统中允许将一个结构体变量直接赋给另一个具有相同结构体类型的变量,如: stu1=stu2 (Turbo C也可以)
可以引用成员变量的地址,也可以引用结构体变量的地址。如: scanf(“%d”,&stu3.birthday.year); printf(“%x”,&stu1);
§10.4 结构体变量的初始化
把各成员的值放在大括号内,用逗号分隔。如: struct student { long num;
char name[20]; char sex;
char addr[30];
} a={99031,”Lilin”,’M’,”123 Beijing Road”};
§10.5 结构体数组
一.结构体数组的定义
也有三种方式:
1.struct student
{ int num;
char name[20]; char sex; int age;
char addr[30]; } ;
struct student stu[3]; 2.struct student
{ int num;
char name[20]; char sex; int age;
char addr[30]; } stu[3] ;
3.struct
{ int num;
char name[20]; char sex; int age;
char addr[30]; } stu[3] ;
数组各元素在内存中连续存放。
stu[0] stu[1] stu[2] 二.结构体数组的初始化
struct student { long num; char name[20]; char sex; int age;
char addr[30];
} stu[3]={ {99031,”Lilin”,’M’,18,”123 Beijing Road”},{99032,”Zhang san”,’M’,20,”130 Shanghai Road”},{99033,”Lisi”,’F’,19,”1010 Zhongshan Road”}};
在定义数组时,若对所有元素都进行了初始化,也可以不指定元素的个数: struct student stu[]={{?},{?},{?}};