BBS水木清华站∶精华区

发信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信区: test 
标  题: 星星流讲座 0047 
发信站: ☆清华电机☆ (Sun Jul 23 00:09:32 1995) 
 
 
第 7 讲 之 5            使用者自定结构 
                        Topic: Structure Arrays and Pointers 
 
结构变数也可以以阵列的方式呈现,例如: 
 
        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; 

 
这个函式有几个值得注意的地方: 
 
第一是它的回传值型态是个结构指标,回传值型态为指标的函数如果 
执行失败,请记得传回 NULL 这个定义,而不要自作聪明地传回其他 
的值。因为 NULL 是 C 语言标准程式库中定义的,所有的编译器都 
会提供安全地处理 NULL 指标的方法。 
 
第二是 mid = low + (high - low) / 2 这一行叙述,它的意思是要求 
low 和 high 的中间值,但是我们为什麽不直接写成 mid = (high + low) / 2 
呢?这是因为位址的算术运算中,只能用减法算出相对位址,而不能用加 
法计算绝对位址。 
 
第三是 &memo[n]。我们一再强调阵列若有 n 个元素,那麽它的排列是由 
a[0] 到 a[n-1],但是这里为什麽使用 &memo[n] 呢?这个元素根本不存 
在呀?事实上 &memo[n] 的用意是指向阵列的最末端,因为结构阵列是 
在编译时间才确定其所占记忆体空间的大小,这个时候我们必须使用这种 
用法才能确定指向紧接於 memo 阵列最末端的下一个位址。 
 
                              &memo[n] 
        ┌┬┬┬┬┬……┬┐□ 
        └┴┴┴┴┴……┴┘ 
 
绝对不要猜测结构阵列的大小,因为你的猜测往往是错误的。 
 
一个很简单的例子,请你自己执行看看: 
 
/* 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,谢谢。 
 
 

BBS水木清华站∶精华区