📄 00000005.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: <A HREF="mailto:ax.bbs@bbs.ee.nthu.edu.tw.">ax.bbs@bbs.ee.nthu.edu.tw.</A> (athena), 信区: test <BR>标 题: 星星流讲座 0047 <BR>发信站: ☆清华电机☆ (Sun Jul 23 00:09:32 1995) <BR> <BR> <BR>第 7 讲 之 5 使用者自定结构 <BR> Topic: Structure Arrays and Pointers <BR> <BR>结构变数也可以以阵列的方式呈现,例如: <BR> <BR> struct record <BR> { <BR> char name[20]; <BR> char address[80]; <BR> char tel[10]; <BR> } card[10]; <BR> <BR> struct record memo[20]; <BR> <BR>有阵列,当然也有指向阵列的指标,例如: <BR> <BR> struct record *p = &memo[0]; <BR> <BR>以下是一个□例函式,它示□的是二元搜寻法 (binary search): <BR> <BR>struct record *binsearch (char *name, struct record *memo, int n) <BR>{ <BR> int cond; <BR> struct record *low = &memo[0]; <BR> struct record *high = &memo[n]; <BR> struct record *mid; <BR> <BR> while (low < high) <BR> { <BR> mid = low + (high - low) / 2; <BR> if ( (cond = strcmp (name, mid->name)) < 0 ) <BR> high = mid; <BR> else if (cond > 0) <BR> low = mid + 1; <BR> else <BR> return mid; <BR> } <BR> return NULL; <BR>} <BR> <BR>这个函式有几个值得注意的地方: <BR> <BR>第一是它的回传值型态是个结构指标,回传值型态为指标的函数如果 <BR>执行失败,请记得传回 NULL 这个定义,而不要自作聪明地传回其他 <BR>的值。因为 NULL 是 C 语言标准程式库中定义的,所有的编译器都 <BR>会提供安全地处理 NULL 指标的方法。 <BR> <BR>第二是 mid = low + (high - low) / 2 这一行叙述,它的意思是要求 <BR>low 和 high 的中间值,但是我们为什麽不直接写成 mid = (high + low) / 2 <BR>呢?这是因为位址的算术运算中,只能用减法算出相对位址,而不能用加 <BR>法计算绝对位址。 <BR> <BR>第三是 &memo[n]。我们一再强调阵列若有 n 个元素,那麽它的排列是由 <BR>a[0] 到 a[n-1],但是这里为什麽使用 &memo[n] 呢?这个元素根本不存 <BR>在呀?事实上 &memo[n] 的用意是指向阵列的最末端,因为结构阵列是 <BR>在编译时间才确定其所占记忆体空间的大小,这个时候我们必须使用这种 <BR>用法才能确定指向紧接於 memo 阵列最末端的下一个位址。 <BR> <BR> &memo[n] <BR> ┌┬┬┬┬┬……┬┐□ <BR> └┴┴┴┴┴……┴┘ <BR> <BR>绝对不要猜测结构阵列的大小,因为你的猜测往往是错误的。 <BR> <BR>一个很简单的例子,请你自己执行看看: <BR> <BR>/* guess.c */ <BR>#include <stdio.h> <BR> <BR>struct guess <BR>{ <BR> int a; <BR> char b; <BR>}; <BR> <BR>void main (void) <BR>{ <BR> printf ("%d\n", sizeof (struct guess)); <BR>} <BR> <BR>可以预告一下,执行结果绝对不是 5 :) <BR> <BR>上面的例子同时示□了如何取得结构变数的大小,就是使用: <BR> <BR> sizeof (型态名称) <BR> <BR>-- <BR>本文原作者为徐振家,原作刊载於星星神教总坛 ☆清华电机☆ test 板。 <BR>你可以以电子文件的形式将本文自由流传於台湾学术网路,但必须包含此版权声明。 <BR>原作者依中华民国著作权法之规定,享有本文之著作权,请勿抄袭以免触法。 <BR>未经授权任何人不得以任何形式对本文做任何修改及商业上之应用。 <BR>其他网路的转载或其他用途的应用,请先知会作者,并取得其同意。 <BR>对本文有任何疑问或意见请 mail 给 <A HREF="mailto:ax.bbs@bbs.ee.nthu.edu.tw,谢谢。">ax.bbs@bbs.ee.nthu.edu.tw,谢谢。</A> <BR> <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -