結(jié)構(gòu)體與函數(shù)
一、結(jié)構(gòu)體作為函數(shù)的參數(shù)
【一】、傳值調(diào)用方式
在函數(shù)之間直接傳遞結(jié)構(gòu)體類型的數(shù)據(jù)——傳值調(diào)用方式。
當(dāng)結(jié)構(gòu)體作參數(shù)或返回值時(shí),會(huì)發(fā)生同名復(fù)制。
而且同類型結(jié)構(gòu)體間,是可以相互賦值的。在具體應(yīng)用中,把函數(shù)的形參定義為結(jié)構(gòu)體變量,函數(shù)調(diào)用時(shí),將主調(diào)函數(shù)的實(shí)參傳遞給被調(diào)函數(shù)的形參。
eg:
【例題】利用結(jié)構(gòu)體變量作函數(shù)的參數(shù)的傳值調(diào)用方式來計(jì)算三角形的面積。
#include "math.h"
#include "stdio.h"
typedef struct triangle //定義結(jié)構(gòu)體類型
{
float a,b,c;
} Area ;
//自定義函數(shù)
float area(Ara side1)
{
float l,s;
l=(side1.a+side1.b+side1.c)/2; //計(jì)算三角形的半周長(zhǎng)
s=sqrt(l(l-side1.a)(l-side1.b)*(l-side1.c)); //計(jì)算三角形的面積公式
return s; //返回三角形的面積s的值到主調(diào)函數(shù)中
}
//程序入口
void main()
{
float s;
Area side;
printf("輸入三角形的3條邊長(zhǎng):\n");
scanf("%f %f %f",&side.a,&side.b,&side.c); //從鍵盤輸入三角形的三邊長(zhǎng)
s=area(side); //調(diào)用自定義函數(shù)
printf("面積是: %f\n",s);
}
【二】、傳址調(diào)用方式
在函數(shù)之間傳遞結(jié)構(gòu)體指針——傳址調(diào)用方式
運(yùn)用指向結(jié)構(gòu)體類型的指針變量作為函數(shù)的參數(shù),將主調(diào)函數(shù)的結(jié)構(gòu)體變量的指針(實(shí)參)傳遞給被調(diào)函數(shù)的結(jié)構(gòu)體指針(形參),利用作為形參的結(jié)構(gòu)體指針來操作主調(diào)函數(shù)中的結(jié)構(gòu)體變量及其成員,達(dá)到數(shù)據(jù)傳遞的目的。
eg:
跟上面的題一樣的條件,利用結(jié)構(gòu)體指針作參數(shù)求三角形的面積(寫了核心的幾句)
float area(Area *p)
{
float l,s;
l=(p->a+p->b+p->c)/2; //計(jì)算三角形的半周長(zhǎng)
s=sqrt(l*(l-p->a)*(l-p->b)*(l-p->c)); //計(jì)算三角形的面積公式
return s;
}
二、結(jié)構(gòu)體作為函數(shù)的返回值
一般情況下,一個(gè)函數(shù)只能有一個(gè)返回值。
但是如果函數(shù)確實(shí)需要帶回多個(gè)返回值的話,可以利用全局變量或指針來進(jìn)行解決。在結(jié)構(gòu)體中可以在被調(diào)函數(shù)中利用return語句將一個(gè)結(jié)構(gòu)體類型的數(shù)據(jù)結(jié)果返回到主調(diào)函數(shù)中,從而得到多個(gè)返回值。
還是以求三角形的例子來引申吧。(還是只寫核心的部分語句)
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