C语言允许用户根据具体问题利用已有的基本数据类型来构造自己所需的数据类型
数组是由相同类型的数据构成的一种数据类型,适用于对具有相同属性的数据进行批量处理
结构体是将不同的数据成员组织到统一的名字之下,适用于对关系紧密、逻辑相关、具有相同或者不同属性的数据进行处理
结构体变量的定义
1.定义结构体的第一步是声明一个结构体模板,其标准格式如下
struct 结构体名
{
数据类型 成员1的名字;
数据类型 成员2的名字;
……
数据类型 成员n的名字;
};
声明结构体模板的主要目的是利用已有的数据类型定义一个新的数据类型
例如,声明一个名为struct student的结构体类型:
struct student
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
};
结构体模板只是声明了一种数据类型,定义了数据的组织形式,并未声明结构体类型的变量,因此编译器不为其分配内存,正如编译器不为int型分配内存一样
2.定义结构体的第二步是利用已经定义好的结构体数据类型来定义结构体变量
1)先声明结构体模板,再定义结构体变量
例如,利用前面已经声明的结构体类型,定义一个具有该类型的结构体变量stu1:
struct student stu1
2)在声明结构体变量的同时定义结构体变量
struct student
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
}stu1;
3.用typedef定义数据类型
关键字typedef用于为系统固有的或者程序员自定义的数据类型定义一个别名
例如:
typedef int INTEGER;
当然也可以为结构体定义一个别名:
typedef struct student STUDENT;
或者
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
int yearOfBirth;
int score[4];
}STUDENT;
所以以下语句是等价的,都可以用来定义结构体变量:
STUDENT stu1,stu2;
struct student stu1,stu2;
注意:typedef只是为已经存在的一种类型定义一个新的名字而已,并没有定义一个新的数据类型
结构体变量的初始化
结构体变量的成员可以通过将成员的初值置于花括号之内来进行初始化,例如:
STUDENT stu1 = {1000001, ”王刚”, ’M’, 1991, {72,73,86,89}};
与下列语句是等价的
struct student stu1 = {1000001, ”王刚”, ’M’, 1991, {72,73,86,89}};
嵌套的结构体
嵌套的结构体意思就是在一个结构体之内包含了另一个结构体作为其成员
比如:
typedef struct date
{
int year;
int month;
int day;
}DATE;
typedef struct student
{
long studentID;
char studentName[10];
char studentSex;
DATE birthday;
int score[4];
}STUDENT;
初始化的方式为:
STUDENT stu1 = {1000001, ”王刚”, ’M’, {1991,5,19}, {72,73,86,89}};
结构体变量的引用
C语言规定,不能将一个结构体变量作为一个整体进行输入输出操作,只能对每个具体的成员进行输入输出操作.因此,不能写成:
printf(“%d%s%d”,stu1);
访问结构体变量要用到成员选择运算符(或者称圆点运算符),其访问格式如下:
结构体变量名 . 成员名
例如:
stu1.studentID = 1000002;
当出现结构体嵌套时,必须使用级联方式访问结构体成员,即通过成员选择运算符逐级找到最底层的成员时再引用.例如:
stu1.birthday.year = 1991;
结构体类型的声明既可以放在所有函数体的外部,可以为所有函数使用,叫做全局声明;也可以放在函数体的内部,只能在本函数体内使用,称为局部声明.