C语言基础笔记:结构体与共用体
结构体类型变量的定义
定义结构体使用修饰符 struct,它一般形式如下:
struct 结构体名
{
成员项列表
};
成员项列表的一般形式如下:
数据类型 成员名 1;
数据类型 成员名 2;
数据类型 成员名 3;
结构体定义后,并没有在内存中为该结构体划分存储空间,它只是作为一种数据结构存在。只有在使用结构体类型声明变量后,系统才用该结构体分配内存空间给变量。使用结构体声明变量的一般形式如下:
struct 结构体名 结构体变量名
该语句只能在结构体定义后出现,如下例所示。
struct student stu1, stu2; //声明结构体变量 stu1 和 stu2
结构体变量的声明还有其他形式,例如直接在定义结构体的同时声明变量,或者省略结构体名直接定义结构体类型的变量。如下例:
struct student //结构体名
{
//成员项列表
} stu1, stu2; //定义结构体的同时声明变量
struct
{
//成员项列表
} strc1, strc2; //省略结构体名直接定义结构体类型的变量
结构体类型变量的引用
引用结构体变量的数据需要同时给出结构体变量名和数据成员名。引用结构体变量的一般形式如下:
结构体变量名.数据成员名
结构体指针的定义和引用
定义结构体变量的一般形式是:
结构体名 *结构体变量名
结构体名作为指针变量的类型修饰符。引用结构体指针所指向的结构体变量成员需要使用“ ->”操作符,该操作符由减号“ –”和小于号“ >”组合而成。如下列源代码:
在设计一些需要大量交换数据的程序时,需要动态为数据划分内存。当不再需要该数据时,可以从内存中释放,以节省程序运行时占用的内存空间。下例将演示为结构体指针动态分配内存的操作方法。
在为结构体动态分配内存空间时,使用 sizeof()函数计算结构体 stu_t 在内存中所需要的空间,然后使用 malloc()函数将 sizeof()函数返回的数量在内存中划分出来。 malloc()函数的返回值是该内存空间的首地址,所以用强制转换表达式“ (stu_t *)”将malloc()返回的地址转换为 stu_t 类型的指针。
指向结构体类型数组的指针的使用
结构体类型数组本质上是作为数组存在,数组的元素是结构体变量。结构体数组的名称即是指向该数组第一个数组元素的指针。结构体数组元素之间不能直接相互复制数据。
下面将介绍通过指针直接访问内存空间复制结构体数组元素的方法。
#include <stdlib.h> //包含内存动态分配相关函数
#include <string.h> //包含内存复制相关函数
共 用 体
共用体又称为联合体,是由不同数据类型组成的一个整体。与结构体不同的是,共用体每次只能使用其中一个成员。结构体的总长度是结构体所有成员长度之和,共用体的总长度是其中最长一个数据类型的长度,共用体的所有成员共享这一存储空间。在一些场合中,只需要使用某一类型的变量而其他类型的变量暂时不需要使用。当使用另一类型变量时,原先的变量也转为与程序无关,这种情况下可使用共用体节省同时存在多种数据类型变量所需要的额外空间。
共用体的定义
定义共用体使用修饰符 union,一般形式是:
union 共用体名 {
成员项列表
};
使用共用体声明变量的一般形式是:
union 共用体名 共用体变量名;
共用体变量的引用
共用体变量的引用方式与结构体变量相同,一般形式为:
共用体名.成员名
但共用体一次只能使用一个成员。如下例:
最后一次输出的结果为不可预知的,因为共用体 x 的存储空间中已经被成员 x.d 使用
过,而输出成员 x.a 前,没有重新为成员 x.a 赋值,这时如果引用成员 x.a 的数据,获得的
是成员 x.d 的一部分数据,所以输出结果可能因系统环境的不同而有差异。