现在的位置: 首页 > 综合 > 正文

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

2013年02月09日 ⁄ 综合 ⁄ 共 1459字 ⁄ 字号 评论关闭

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

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

有时想将一个结构体变量的值传给另一个函数,但原来的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");
}

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

抱歉!评论已关闭.