9.9 指针与结构体

9.9.1 类型问题

结构体类型是一种数据类型,结构体数据也是一种数据对象。因此也可以构造出对应的指针类型。这种指针的运算规则遵守指向数据类型指针的运算规则。仍以前面的结构体类型为例:

9.9 指针与结构体 - 图1

这种结构体类型的名称是“struct shijian”,对应的指针的类型是“struct shijian*”。可以用这个类型名定义相应的指针变量,如:

9.9 指针与结构体 - 图2

同样,如果定义了这种类型的结构体变量:

9.9 指针与结构体 - 图3

也可以通过“&”运算求得指向这个结构体变量的指针“&cs”,它的类型也是“struct shijian*”,显然这是一个指针常量。如图9-28所示,如果希望指针变量“p_cs”指向结构体变量“cs”,可以通过赋值运算实现:

9.9 指针与结构体 - 图4

图9-28 指向结构体数据的指针

9.9 指针与结构体 - 图5

9.9.2 通过指针读写结构体的成员

通过指向结构体类型的指针,同样可以对结构体类型量的成员进行访问。由于“*p_cs”就是“cs”,因而可以通过下面的形式访问“cs”的成员:

9.9 指针与结构体 - 图6

注意这里“()”是必需的,因为“*”运算的优先级低于“.”运算的优先级。和“cs.shi”一样,这个表达式也可以作为左值。

此外,C语言还提供了另一种通过指针访问结构体成员的方法,即“->”运算,具体的方法是:

9.9 指针与结构体 - 图7

这和“(*p_cs).shi”是一样的。

下面代码是指向结构体的指针用法的演示。

程序代码9-29

9.9 指针与结构体 - 图8

9.9 指针与结构体 - 图9

运行结果如下:

9.9 指针与结构体 - 图10

练习

编写一个对分数约分的函数,并自己编写测试代码测试。