5. 结构型指针
(1)结构型指针的概念
一个指向结构类型变量的指针称为结构型指针,该指针变量的值也是它所指向的结构变量的起始地址。结构型指针也用来指向结构数组或结构数组中的元素。
定义结构型指针的一般形式为:
struct 结构类型标识符 * 结构指针标识符
其中“结构指针标识符”就是所定义的结构型指针变量的名字,“结构类型标识”就是该指针所指向的结构变量的具体类型名称。
例:struct mepoint * mp;
(2)用结构型指针引用结构元素
通过结构型指针引用结构元素的一般形式为:
结构指针→结构元素
例:mp→pressure等同于(* mp).pressure
6. 结构与函数
(1)结构作为函数的参数
一般来说,结构既可作为函数的参敏,也可作为函数的返回值。当结构被用作函数的参数时,其用法与普通变量作为实参是一样的,其参数传递属于“值传递”方式。
程序在进行函数调用时,将整个结构变量作为参数传递给被调函数。系统为形式参数的结构变量分配存储空间,并从相应的实际参数中取得各个元素的值。函数对形参中各个结构无素值进行的修改不会对相应的实参结构变量产生任何影响。
(2)结构型指针作为函数的参数
当结构较大时,若将该结构作为函数的参数,由于参数传递采用值传递方式,需要较大的存储空间(堆栈)来将所有的结构元素压栈和出栈,尤其当函数参数是结构数组时,影响更大,此外还会影响程序的执行速度。实际上可以用结构型指针来作为函数的参数,此时参数的传递是按地址传递方式进行的。由于采用的是地址传递方式,只需要传递一个地址值,与前者相比,既可节省存储空间,同时还可加快程序的执行速度。缺点是在调用函数时对结构指针所作的任何变动都会影响到原来的结构变量。
(二)联合
联合也是C语言中一种构造类型的数据结构。在一个联合中可以包含多个不同类型的数据元素。各种类型的变量放在同-个地址开始的内存单元中,实现了多层数据覆盖,一方面有效地提高内存的利用率,另一方面也方便了数据类型间的转换。
1. 联合的定义
定义联合类型变量的一般形式:
union 联合类型名
{ 成员表列 } 变量表列;
也可以将类型定义与变量定义分开。即先定义一个union data类型,再将a、b、c定义为union data类型的变量。
还可以直接定义联合变量。
由此可见,联合类型与结构类型的定义方法是很相似的,只是将关键字struct改成了union。但是在内存的分配上它们之间有着本质的区别。结构变量所占用的内存长度是其中各个元素所占用内存长度的总和;而联合变量所占用的时存长度是其中最长的元素的长度。联合变量中的元素分时占用相同的存储空间。
2. 联合变量的引用
与结构变量类似,对联合变量的引用也是通过对联合元素的引用来实现的,引用联合元素的一般格式为:
联合变量名.联合元素
或
联合变量名->联台元素
例:
a.i //引用联合变量a中的float型元素
a.j //引用联合变量a中的long型元素
b.k //引用联合变量b中的int型元素
c.m //引用联合变量c中的char型元素
在引用联合元素时,要注意联合变量用法的一致性。因为联合类型中定义的各个不同类型的元素都可以分时地赋给变量,而所读取变量的值是最近放入的某一元素的值,因此在表达式中对它进行处理时,必须注意其类型要与表达式所要求的类型保持一致,否则将导致程序运行出错。
联合变量不能整体引用,例如下面的写法就是错误的:
printf(“%f”,a);
因为变量a可能是 float、long、int和char三种类型,分别占用不同长度的内存区域,若在引用时仅写联合变量名a,系统将难以确定究竟应该输出哪一个联合元素的值。
正确的写法为:
printf(“%f”,a.i);
联合类型的数据占用的内存空间在某一时刻只能存放一种类型的元素。