C学习-基础:结构体指针 结构体做函数参数
结构体指针定义
当指针变量指向一个结构体变量时,称之为结构体指针变量,其值是所指向的结构体变量的起始地址。
struct 结构名 *结构指针变量名
struct person *pabook; struct person ab1; 则:pabook=&ab1; 是正确的, 而:pabook=&person; 是错误的。
通过指针访问结构体变量的成员
(*结构体指针变量).成员名
或为:
结构体指针变量->成员名
例如:(*pabook).name
或:pabook->name
注意:pabook首先要初始化(即要有明确的指向关系),然后才能进行结构体变量的各种操作。
指向结构体数组的指针
结构体指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址。
结构体指针变量也可指向结构体数组的一个元素,这时指针变量的值是该结构体数组元素的首地址。
若psa为指向结构体数组的指针变量,则psa也指向该结构体数组的0号元素,psa+1指向1号元素,psa+i则指向i号元素。这与普通数组的情况是一致的。
例子:
struct person { long num; char name[30]; int age; char sex; char address[200]; } abook[3] = { {1, "Xu Chong", 25, 'F', "Beijing"}, {2, "Tao Wei", 26, 'F', "Shanghai"}, {3, "Liu Qin", 35, 'M', "Shenzhen"}}; void main() { int i; struct person *psa; printf("Num\t\tName\t\t\tage\t\tsex\t\t\n"); psa = abook; for (i = 0; i < 3; i++) { printf("%ld\t\t%s\t\t%d\t\t%c\t\t\n", psa->num, psa->name, psa->age, psa->sex); psa++; } }
说明:语句psa++;每次psa自增后自动跳过一个结构体类型的长度,指向下一个结构体变量的首地址,这样才能正确输出结构变量的成员。如:
当psa+0指向 abook[0] 的首地址;
当psa+1指向 abook[1] 的首地址;
当psa+2指向 abook[2] 的首地址。
结构体在函数传递中的应用
C语言中允许用结构体变量作函数参数进行整体传送。但这种传送要将全部成员逐个传送,特别是成员为数组时,传送的时间和空间开销会很大,程序效率会很低。
因此,最好的办法就是使用指针,即用指针变量作函数参数进行传送,这时,由实参传向形参的只是内存数据的地址,从而减少了时间和空间的开销。
#include <stdio.h> struct person //定义结构体类型 { long num; char name[30]; int age; char sex; char address[200]; }; void average(struct person *inps, int nums) // 算法函数 { int c = 0, i, avg, sum = 0; for (i = 0; i < nums; i++, inps++) { sum += inps->age; if (inps->age < 30) { c++; //统计年龄小于 30 的 } } avg = sum / nums; printf("\n统计人数为:%3d\n平均年龄为:%3d\n小于30岁的人数为=%3d\n", nums, avg, c); } int main(int argc, char const *argv[]) //主函数 { int waitag; struct person abook[4] = { //定义结构体 数组 4 个元素 {1, "Xu Chong", 25, 'F', "Beijing"}, {2, "Tao Wei", 25, 'F', "Shanghai"}, {3, "Liu Qin", 34, 'M', "Shenzhen"}, {4, "Liu Qin", 18, 'F', "Henan"}, }, *psa = abook; //设定,结构体指针变量 psa average(psa, 4); //用结构体指针变量 psa 作函数参数,4 为数组数目 scanf("%d", &waitag); return 0; }
结果为:
统计人数为: 4 平均年龄为: 25 小于30岁的人数为= 3
共 0 条评论