1.介绍了各种基本类型(如整型、实型、字符型)、构造数据类型(如数组)和指针类型。但是,在解决一些较复杂的实际问题时,只使用这些数据类型是不够的。例如,在描述一本图书的信息时,图书编号、书名、专业领域、作者、出版社、单价等都是和图书相关的基本信息,这些信息是作为一个整体来描述图书的,如果将它们分别定义为互相独立的简单变量,则难以体现它们之间的内在联系。因此需要一种新的数据类型来描述图书,从而能够方便的保存和获取与图书相关的全部信息。为了解决这个问题,C语言提供了一种名为结构体(简称为结构)的数据类型。
2.结构的概念及定义
结构是将彼此相关的、类型不同的数据组合在一起的构造数据类型,它是由若干成员(也称为结构分量)组成的,每一个成员的数据类型可以是基本数据类型,也可以是构造类型。在使用某个结构之前必须先声明它,即根据需要构造它。声明结构类型的一般形式为:
struct 结构名
{类型名成员名1;类型名成员名2;
.....类型名成员名n;
}
说明(1)关键字struct 与结构名一起构成结构类型名。
(2)大括号中的内容是结构所包括的成员。成员可以有多个,每一个的数据类型可以是基本类型,也可以是结构类型。结构名和成员名的命名应符合标识符的规定。成员名可以与程序中其它变量同名,互不干扰。
(3)结构类型定义只是说明了结构类型的构成情况,即告诉系统该类型是由哪些类型的成员构成,各占多少个字节,系统并不分配内存空间,只有用结构类型定义了结构变量以后系统才会为结构变量分配内存空间。
(4)定义结构类型时,不允许将成员的数据类型定义成自身的结构类型,这是因为结构类型的声明是构造阶段,系统还不知道需要分配多少内存空间。但是结构类型中可以含有指向自身类型的指针变量。
(5)结构和数组的主要区别是:结构是数目固定、不同数据类型的有序数据的集合;而数组是数目固定、具有相同数据类型的有序数据的集合。可以将结构的成员定义为一个数组,同时,数组中的每个数组元素也可以是同一个结构类型。
(6)C语言把结构声明看做是一条语句,括号后面的分号是不可少的。
例 为了描述图书的信息,定义了一个结构类型为
struct books
{int bno;char bname[20];char field[10];char author[10];char publisher[30];float price;
};
结构类型名为struct books,成员有 bno、bname[20]、field[10]、author[10]、publisher[30]和price。如果几个成员的数据类型相同,可以出现在一个类型定义中,成员名之间用逗号分隔,如上述结构类型的声明也可以用如下形式:
struct books
{int bno;char bname[20],field[10],author[10],publisher[30];float price ;}:
3. 结构的嵌套定义
方法一:先定义成员的结构类型,在定义主结构类型。
struct pubdate
{int year;int month;int day;
};
struct books
{int bno;char bname[20],field[10],author[10],publisher[30];
struct pubdate pdate;/*定义一个 struct pubdate 结构类型的成员 pdate */
float price ;
};
方法二:在主结构类型内部定义成员的结构类型对上述代码修改如下:
struct books
{int bno;char bname[20],field[10],author[10],publisher[30];struct pubdate
{int year;int month;int day;}pdate;
float price;
};
接下来举一个具体的实例。
#include <stdio.h>// 定义内部结构体
struct Address {char city[20];char street[30];int houseNumber;
};// 定义外部结构体,包含内部结构体作为成员
struct Person {char name[20];int age;struct Address addr;
};int main() {// 创建一个 Person 结构体变量并初始化struct Person person = {"Tom", 25, {"New York", "Main Street", 100}};// 输出结构体变量的内容printf("Name: %s\n", person.name);printf("Age: %d\n", person.age);printf("City: %s\n", person.addr.city);printf("Street: %s\n", person.addr.street);printf("House Number: %d\n", person.addr.houseNumber);return 0;
}