结构体与函数
一、结构体作为函数的参数
【一】、传值调用方式
在函数之间直接传递结构体类型的数据——传值调用方式。
当结构体作参数或返回值时,会发生同名复制。
而且同类型结构体间,是可以相互赋值的。在具体应用中,把函数的形参定义为结构体变量,函数调用时,将主调函数的实参传递给被调函数的形参。
eg:
【例题】利用结构体变量作函数的参数的传值调用方式来计算三角形的面积。
#include "math.h"
#include "stdio.h"
typedef struct triangle //定义结构体类型
{
float a,b,c;
} Area ;
//自定义函数
float area(Ara side1)
{
float l,s;
l=(side1.a+side1.b+side1.c)/2; //计算三角形的半周长
s=sqrt(l(l-side1.a)(l-side1.b)*(l-side1.c)); //计算三角形的面积公式
return s; //返回三角形的面积s的值到主调函数中
}
//程序入口
void main()
{
float s;
Area side;
printf("输入三角形的3条边长:\n");
scanf("%f %f %f",&side.a,&side.b,&side.c); //从键盘输入三角形的三边长
s=area(side); //调用自定义函数
printf("面积是: %f\n",s);
}
【二】、传址调用方式
在函数之间传递结构体指针——传址调用方式
运用指向结构体类型的指针变量作为函数的参数,将主调函数的结构体变量的指针(实参)传递给被调函数的结构体指针(形参),利用作为形参的结构体指针来操作主调函数中的结构体变量及其成员,达到数据传递的目的。
eg:
跟上面的题一样的条件,利用结构体指针作参数求三角形的面积(写了核心的几句)
float area(Area *p)
{
float l,s;
l=(p->a+p->b+p->c)/2; //计算三角形的半周长
s=sqrt(l*(l-p->a)*(l-p->b)*(l-p->c)); //计算三角形的面积公式
return s;
}
二、结构体作为函数的返回值
一般情况下,一个函数只能有一个返回值。
但是如果函数确实需要带回多个返回值的话,可以利用全局变量或指针来进行解决。在结构体中可以在被调函数中利用return语句将一个结构体类型的数据结果返回到主调函数中,从而得到多个返回值。
还是以求三角形的例子来引申吧。(还是只写核心的部分语句)
struct cir_area result;
result.l=(a+b+c)/2;
result.s=sqrt(result.l*(result.l-a)*(result.l-b)*(result.l-c));
return result; //返回了l和s