当一个指针变量用来指向一个结构体变量时,我们称之为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相类似的。
声明结构体指针变量的一般形式如下:
其中,“结构体类型名”必须是已经被定义过的结构体类型。
例如,声明一个指向结构体变量的指针变量。
结构体指针变量的定义规定了其特性,并为结构体指针变量分配了内存单元。在使用结构体指针变量前,必须通过初始化或赋值运算的方式将具体的某个结构体变量的存储地址赋值给它。这时要求结构体指针变量与结构体变量必须属于同一结构体类型。例如,ps=&a;是错误的。因为变量a的数据类型与指针变量ps的基类型不相同。ps=&studeng_type;也是错误的,因为student_type是结构体类型名,不占用存储单元,因而没有内存地址。
上述格式是正确的,因为变量stud的数据类型与指针变量ps的基类型相同。
在这里,结构体指针变量ps指向结构体类型变量stud,因此,结构体类型变量stud的成员(如score)可以表示为如下形式。
注意:*ps两边的括弧不可省略,因为成员运算符“.”的优先级高于运算符“*”。
在C语言中,为了直观和使用方便,可以把(*ps).score改用ps->score来代替,即结构体指针变量ps所指向的结构体变量中的score成员。同样,(*ps).name等价于ps->name。也就是说,当一个结构体指针变量指向一个结构体类型变量时,以下3种形式是等价的。
(1)结构体类型变量.成员名
(2)(*结构体指针变量).成员名
(3)结构体指针变量->成员名
其中,“->”也是一种运算符,称为指向运算符,它表示的意义是结构体指针变量所指向的结构体数据中的成员。
【例9-3】通过结构体指针引用结构体变量的成员。
程序运行结果如图9-3所示。
图9-3 例9-3的运行结果
既然结构体类型指针变量可以指向一个结构体变量,那么结构体类型指针变量也可以指向一个结构体数组。这时结构体指针变量的值是整个结构体数组的首地址。同样,结构体指针变量也可指向结构体数组的一个元素,这时结构体指针变量的值是该结构体数组元素的首地址。设ps为指向结构体数组的指针变量,则ps指向该结构体数组的0号元素,ps+1指向1号元素,ps+i则指向i号元素,这与普通数组的情况是一致的。
若有以下声明,(www.xing528.com)
则需要注意以下两点。
(1)结构体指针变量ps的初值为st,即ps保存结构体数组st的首地址,ps指向数组st的第一个元素,即ps的值为&st[0],以此类推,ps+1的值为&st[1]。那么,可以有下面的
表达式。
(2)ps已定义为指向struct student类型数据的指针变量,它只能指向一个此结构体类型数据。也就是说,ps只能用来保存st数组的某个元素的起始地址,而不能指向结构体类型数据的某一成员,即ps不能用来保存数组元素的某一成员的地址。例如,ps=&st[1];是正确的,而ps=&st[0].num;是错误的。
【例9-4】通过结构体指针对结构体数组进行操作。
例9-4 运行视频
程序运行结果如图9-4所示。
图9-4 例9-4的运行结果
2.用指向结构体类型数据的指针作函数参数
在ANSIC标准中,允许用结构体变量作函数参数进行整体传递,但是要求将全部成员逐个传递,尤其是当成员为数组时会使传递的时间和空间开销很大,严重地降低了程序的效率。最好的办法就是使用指针,即用指向结构体类型数据的指针变量作函数参数进行传递。这时由实参传递给形参的只是结构体类型数据的地址,通过结构体指针形参来对结构体类型数据进行操作,从而减少了时间和空间的消耗。
【例9-5】用指向结构体数组元素的指针作函数参数。
例9-5 运行视频
程序运行结果如图9-5所示。
图9-5 例9-5的运行结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。