指向结构体类型数据的指针

第六节 指向结构体类型数据的指针

三、用指向结构体的指针作函数参数

有时想将一个结构体变量的值传给另一个函数,但原来的C标准不允许用结构体变量作为函数参数。那么用什么方法来解决这个问题呢?有两个方法:

①用结构体变量的成员作参数。例如,用stu[2].name作函数实参,将实参值传给形参。用法和用普通变量作实参是一样的,属“值传递”方式。
②用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给开参。

[例8.5] 有一个结构体变量stu.内含学生学号、姓名和三门课的成绩。要求在main函数中赋以值,在另一函数print中将它们打印输出。

#include "string.h"
#define format"%d/n%s/n%f/n%f/n"
struct student
{int num;
char name[20];
float score[3];
};
main()
{void print();
struct student stu;
stu.num=12345;
strcpy(stu.name,"Li Li");
stu.score[0]=67.5;
stu.score[1]=89;
stu.score[2]=78.6;
printf(&stu);
}
void print(p)
struct student *p;
{printf(format,p->num,p->name,p->score[0],p- >score[1],p>score[2]);
printf("/n");
}

运行结果为:
12345
Li Li
67.500000
89.000000
78.599998

struct student 被定义为外部类型,这样,同一源文件中的各个函数都可以用它来定义变量的类型。main函数中的stu变量定义为struct student 类型,print函数中的形参这被定义为指向struct student类型数据的指针变量。在main函数中对stu的各成员赋值。注意在调用函时,用&stu作实参,&stu是结构体变量stu的地址。在调用函数时将该地址传送给形参p(p是指针变量)。这样p就指向stu。在print函数中输出p所指向的结构体变量的各个成员值,它们也就是stu的成员值。

main函数中的对各成员赋值也可以改用scanf函数输入。即用scanf("%d %s %f %f %f",&stu.num,stu.name,&stu.score[1],&stu.score[2]);

输入时用下面形式输入:
12345 Lili 67.5 89 78.6
注意: 输入项表列中stu.name前没有“&"符号,因为stu.name是字符数组名本身代表地址,不应写成&stu.name。

ANSI C允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同。例10.5中main函数中最后一行调用print函数,也可改用print(stu); 即实参改用结构体变量(而不是指针)。同时print函数也应相应改为:
void print(stud)
struct student stud;
{printf(format,stud.num,stud.name,stud.score[0],stud.score[1],
stud.score[2]);
print("/n");
}

把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,费时间又费空间,开销大。如果结构体类型中的成员很多,或有一些成员是数组,则程序运行效率会大大降低。在这种情况下,用指针作函数参数比较好,能提高运行效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值