📄 c54.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>结构和函数 </title>
<script language="javascript">
var prePage="http://www.nec.sjtu.edu.cn/support/Course/C/c/c5/c/c5/c53.htm";
var nextPage="c/c5/c55.htm";
</script>
<link rel="stylesheet" href="../cstyle.css" type="text/css">
<bgsound src="../voice/c54.au" loop="1">
</head>
<body background="../img/mainback.jpg" bgproperties="fixed">
<h2 align="center"><font face="楷体_GB2312"><a name="_top"></a>5.4 <font COLOR="#000000">结构和函数</font></font></h2>
<div align="center"><center>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td width="50%" align="center"><a href="c54.htm#c541.html#c541">结构作为函数的参数</a></td>
<td width="50%" align="center"><a href="c54.htm#c542.html#c542">结构作为函数的返回值</a></td>
</tr>
</table>
</center></div>
<hr>
<h3><a name="c541"></a>1.结构作为函数的参数</h3>
<blockquote>
<p align="left">结构是比简单数据类型稍复杂的一种数据类型。在大多数旧实现中,
结构本身不能用来作为函数的参数。但在较新实现中,
此限制取消了。用结构作为参数有四种情形:<br>
1. 直接用它本身<br>
2. 用结构成员<br>
3. 用结构地址<br>
4. 用数组</p>
<p align="left">情形 1 :直接用结构作为参数<br>
</p>
<blockquote>
<p align="left">模块 1 :函数定义<br>
struct book<br>
{<br>
float cost;<br>
int series;<br>
};<br>
float fcost(<font color="#FF0000">struct book item1,struct book item2</font>)<br>
{<br>
if (item1.series!=item2.series)<br>
return(item1.cost+item2.cost);<br>
else return(item1.cost);<br>
}</p>
</blockquote>
<blockquote>
<p align="left">模块 2 :主程序<br>
#include "stdio.h"<br>
main()<br>
{<br>
struct book book1,book2;<br>
float fcost(struct book,struct book);<br>
printf("Please input series and cost of book1 and
book2.\n");<br>
scanf("%d %f %d %f",&book1.series,
&book1.cost,&book2.series, &book2.cost);<br>
printf("total cost is %.2f\n", <font color="#FF0000">fcost(book1,book2)</font>);<br>
}</p>
</blockquote>
<blockquote>
<p align="left"><font color="#FF0000">注意:</font>这种性能依赖于具体实现。如果这种方法不行,
你可以用其它方法来满足你的需要!!</p>
</blockquote>
<p align="left">情形 2 :用结构成员作为参数</p>
<blockquote>
<p align="left">struct payment {<br>
char *name;<br>
float salary;<br>
float subsidy;<br>
}clerk={ "Karlis",150.20,30.0};<br>
<br>
<br>
main()<br>
{<br>
float total,sum(float,float);<br>
extern struct payment clerk;<br>
printf("clerk %s has a total wage\n<br>
of $%.2f\n",clerk.name,\n<br>
<font
color="#FF0000">sum(clerk.salary,clerk.subsidy)</font>);<br>
}<br>
float sum(float x,float y)<br>
{<br>
return(x+y);<br>
}</p>
</blockquote>
<blockquote>
<p align="left">解释:salary 和 subsidy 是结构clerk
的成员。它们都是简单类型 --float类型。
它们当然可以用作函数的参数。</p>
</blockquote>
<p align="left">情形 3 :用结构地址</p>
<blockquote>
<p align="left">struct payment {<br>
char *name;<br>
float salary;<br>
float subsidy;<br>
}clerk={"Karlis",150.20,30.0};<br>
</p>
<p align="left">main()<br>
{<br>
float sum(struct payment *);<br>
printf("clerk %s has a total wage\n<br>
$%.2f.\n",<font color="#FF0000">sum(&clerk)</font>);<br>
}<br>
float sum(<font color="#FF0000">struct payment *wage</font>)<br>
{<br>
return(wage->salary+wage->subsidy);<br>
}</p>
</blockquote>
<blockquote>
<p align="left">解释:结构的地址是一个单个的数。用它作为函数参数是非常好的。&运算符是用来得到结构的地址。把地址
& clerk 传给函数 sum(), 使得 wage 指针指向 结构 clerk。<br>
参阅 6 . 1 和6 . 2。</p>
</blockquote>
<blockquote>
<p align="left"><font color="#FF0000">注意</font>:
初学者很难理解这种情形。你可以暂时忽略这一段, 学过第 6
章指针之后再来学它。<br>
<br>
</p>
</blockquote>
<p align="left">情形 4 :用数组</p>
<blockquote>
<p align="left">模块 1 :变量的定义和初始化<br>
struct payment<br>
{<br>
char *name;<br>
float salary;<br>
float subsidy;<br>
} clerk[2]={{"Karlis",150.2,20},{"Fred",146.5,20}};</p>
</blockquote>
<blockquote>
<p align="left">模块 2 :主程序<br>
main()<br>
{<br>
float sum(struct payment *);<br>
printf("The total money is\n<br>
$%.2f\n",<font color="#FF0000">sum(clerk)</font>);<br>
}<br>
float sum(<font color="#FF0000">struct payment *wage</font>)<br>
struct payment *wage;<br>
{<br>
float total;<br>
int i;<br>
for(i=0,total=0;i<2;i++,wage++)<br>
total+=wage->salary+wage->subsidy;<br>
return(total);<br>
}</p>
</blockquote>
<blockquote>
<p align="left"><br>
解释:作为结构数组,数组名是指向数组的指针。也就是说,
它是地址的代名词。因此它可以传递给函数。<br>
请参阅第 6 章指针!!</p>
<p align="right"><a href="c54.htm#_top.html#_top">返回页首</a></p>
</blockquote>
</blockquote>
<hr>
<h3><a name="c542"></a>2.结构作为函数的返回值</h3>
<blockquote>
<p>就象用结构作为函数参数一样,
有些实现允许直接用结构作为函数返回值,
但有些实现不允许。看解释和例子。</p>
<p>情形 1 :直接用结构</p>
<blockquote>
<p>struct content<br>
{ <br>
int n1;<br>
int n2;<br>
int avg;<br>
};<br>
struct content value(<font color="#FF0000">struct content item</font>)<br>
{<br>
item.avg=(item.n1+item.n2)/2;<br>
item.n1=0;<br>
item.n2=0;<br>
<font color="#FF0000">return(item);</font><br>
}</p>
</blockquote>
<p>情形 2 :用结构地址</p>
<blockquote>
<p>这种方法也可通过用指向结构的指针来实现.<br>
格式是: <br>
struct 类型名1 *函数名 ( 类型名2 参数 )<br>
{<br>
...<br>
return( 指向类型 1 的指针 );<br>
}<br>
<img src="../img/c541.jpg" alt="c541.jpg (7042 bytes)" WIDTH="325" HEIGHT="125"></p>
<p align="right"><a href="c54.htm#_top.html#_top">返回页首</a></p>
<p> </p>
</blockquote>
</blockquote>
<p align="center"><a href="http://www.nec.sjtu.edu.cn/support/Course/C/c/c5/c55.htm"><img src="../img/next.gif" width="145" height="30"
alt="next.gif (3633 bytes)" border="0"></a></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -