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毫秒