Linux 版 (精华区)
发信人: netiscpu (夜☆星光点点☆), 信区: Linux
标 题: ◇ 星星流讲座 0047
发信站: 紫 丁 香 (Sun Nov 8 18:39:26 1998), 转信
寄信人: guest.bbs@hgluo.hust.edu.cn
标 题: ◇ 星星流讲座 0047
发信站: 华南理工大学 BBS木棉站
日 期: Thu Feb 20 14:57:11 1997
发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test
标 题: 星星流讲座 0047
发信站: ☆清华电机☆ (Sun Jul 23 00:09:32 1995)
;35m第 7 讲 之 5 使用者自定结构
Topic: Structure Arrays and Pointersm
结构变数也可以以阵列的方式呈现,例如:
struct record
{
char name[20];
char address[80];
char tel[10];
} card[10];
struct record memo[20];
有阵列,当然也有指向阵列的指标,例如:
struct record *p = &memo[0];
以下是一个□例函式,它示□的是二元搜寻法 (binary search):
struct record *binsearch (char *name, struct record *memo, int n)
{
int cond;
struct record *low = &memo[0];
struct record *high = &memo[n];
struct record *mid;
while (low < high)
{
mid = low + (high - low) / 2;
if ( (cond = strcmp (name, mid->name)) < 0 )
high = mid;
else if (cond > 0)
low = mid + 1;
else
return mid;
}
return NULL;
}
这个函式有几个值得注意的地方:
第一是它的回传值型态是个结构指标,m回传值型态为指标的函数如果
执行失败,请记得传回 NULL 这个定义,而不要自作聪明地传回其他
的值0m。因为 NULL 是 C 语言标准程式库中定义的,所有的编译器都
会提供安全地处理 NULL 指标的方法。
第二是 mid = low + (high - low) / 2 这一行叙述,它的意思是要求
low 和 high 的中间值,但是我们为什麽不直接写成 mid = (high + low) / 2
呢?这是因为m位址的算术运算中,只能用减法算出相对位址,而不能用加
法计算绝对位址0m。
第三是 &memo[n]。我们一再强调阵列若有 n 个元素,那麽它的排列是由
a[0] 到 a[n-1],但是这里为什麽使用 &memo[n] 呢?这个元素根本不存
在呀?m事实上 &memo[n] 的用意是指向阵列的最末端,因为结构阵列是
在编译时间才确定其所占记忆体空间的大小,这个时候我们必须使用这种
用法才能确定指向紧接於 memo 阵列最末端的下一个位址。0m
&memo[n]
┌┬┬┬┬┬……┬┐□
└┴┴┴┴┴……┴┘
m绝对不要猜测结构阵列的大小,因为你的猜测往往是错误的。0m
一个很简单的例子,请你自己执行看看:
/* guess.c */
#include <stdio.h>
struct guess
{
int a;
char b;
};
void main (void)
{
printf ("%d\n", sizeof (struct guess));
}
可以预告一下,执行结果绝对不是 5 :)
上面的例子同时示□了如何取得结构变数的大小,就是使用:
sizeof (型态名称)
--
本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。
你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。
原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。
未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。
其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。
对本文有任何疑问或意见请 mail 给 ax.bbs@bbs.ee.nthu.edu.tw,谢谢。
--
m;32m※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: mtlab.hit.edu.cn]
--
Enjoy Linux!
-----It's FREE!-----
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: mtlab.hit.edu.cn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.132毫秒