结构是一个或多个变量的集合,这些变量可能为不同的类型(区别于数组),为了处理的方便而将这些变量组织在一个名字之下。它也被称之为结构体,是C语言提供的一种定义自定义数据类型的方式。结构体给了程序员自行实现自己所需要数据结构的能力。ANSI定义了结构的赋值操作——结构可以拷贝、赋值、传递给函数,函数也可以返回结构类型的返回值。
结构的声明是通过struct关键字来实现的,比较常见的一个例子是二维坐标系中坐标点的例子,一个坐标点包含两个变量,这两个变量可以定义在一个结构体中,那么这个结构体就可以表示一个二维平面上的点,结构体的声明如下:
struct point {
int x;
int y;
};
仅仅声明结构体是不分配内存空间的,它只是定义了一个概念上的东西。如果要让一个结构体在内存中分配空间,则必须定义它,定义结构体的方式和定义普通变量的方式是一样的,都是通过变量类型,变量名来定义的,定义的示例如下:
struct point pt;
也可以通过typedef来简化定义:
typedef struct point {
int x;
int y;
}point;
point pt;
结构体与函数
结构体的合法操作只有几种:作为一个整体赋值和复制,通过&运算符取地址,访问其成员。当结构体作为参数传入其他函数中,它和其他类型的变量是一样的,都是通过值传递的。也就是说,当把结构体传入到函数中时,被传入函数中会创建一个此结构体的拷贝。如果传入的结构体很大,使用指针的方式效率会比较高,因为这样就不用复制整个结构体中的成员。
结构数组
以结构体作为成员的数组就是结构数组,也叫结构体数组。结构数组的声明如下:
struct key {
char *word;
int count;
};
sturct key keytab[NKES];
联合
联合是可以(在不同时刻)保存不同类型和长度的对象的变量,编译器负责跟踪对象的长度和对齐要求。联合的定义如下:
union u_tag {
int ival;
float fval;
char *sval;
} u;
位字段
位字段和联合一样现在也极少被使用了。