正文

重新认识struct(2)2005-08-15 11:43:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/edwardguo/3817.html

分享到:

5.函数对结构的使用
eg.:
/* ptinrect: return 1 if p in r, 0 if not */
int ptinrect(struct point p, struct rect r)
{
    return p.x >= r.pt1.x && p.x < r.pt2.x && p.y >= r.pt1.y && p.y < r.pt2.y;
}
以上种种显示,结构体和一般的变量没有本质的区别,其不同仅仅是在定义上.
由5中函数对rectangle的判断,可以分析出在处理长方形问题上的方法,一个长方形可以用其对角的两个点表示,并且可由这两个点解决很多实际的问题,比如上面的判断一个点是否在长方形内部.
在这里我对几个概念做一下总结性描述:
structure:结构体,通常一个结构体通过一个结构体标记表示(structure tag)
structure varialbe:结构体变量.像一般变量一样,不同的是其是由结构体定义(申明).
虽然结构体和类在c++中没有本质的区别,但是我们依然不混用他们,其原因就是他们内在含义的不同,而这几个概念就是他们含义的一种体现.

6.结构体使用技巧,传递指针而非结构体变量本身.
If a large structure is to be passed to a function, it is generally more efficient to pass a pointer than to copy the whole structure.(K&R 《the c programming language》)
这里的高效,体现在传递指针不需要为变元的副本拷贝提供过大的开销,这样的问题特别出现在巨大的结构体和类上面,对于一个小的结构,虽然从本质上来说使用指针来提高效率作用颇小,但是却因为一些微妙的原因值得我们去做.关于函数参数的传递问题,在函数参数的按引用传递和按值传递上表现的很明显,相关内容建议参考<<c++ how to program>>.
前面说过,结构体和一般的变量没有本质的区别,其不同仅仅是在定义上.所以说,在对于指针的使用方面,结构体造常规使用.唯一特殊的是,为了方便的使用指针,出现了"->"运算符号.使用方法是:指针->成员.
注意:(*pp).x 括号是必须的,因为.的优先级高于*.优先级参见<<the c programming language>>Page:50.
实例: *p->str++ 表示的就是 结构 p 指针中的 str 加1 在指向地址对应的值.注意:*,++是从右到左的.









结构体实例:
选自<<the c programming language>>

问题:Consider writing a program to count the occurrences of each C keyword.(写一个程序计算c中的关键字)
分析:对于问题,我们必须要分析的目标是:keyword和keyword的个数,更显然的问题是,一个keyword一定需要一个keyword数量于之对应.显然,一组数据的依赖关系产生了,结构体就是用于来处理相关数据的.由此,没有理由不使用structure.
小结:何时使用结构体?当我们遇见一组相关数据的时候,使用结构体,相关数据的一种情况就是,一个数据伴随另外一个数据产生.
求解:
建立结构体:
struct key{
    char *word;
    int count;
}keytab[]={
    "auto", 0,
    "break", 0,
    "case", 0,
    "char", 0,
    "const", 0,
    "continue", 0,
    "default", 0,
    /* ... */
    "unsigned", 0,
    "void", 0,
    "volatile", 0,
    "while", 0
};          //涉及知识,结构体定义,结构体初始化(定义同时初始化).
这里为了大家对初始化更加清晰的了解,做一下解释:
对于上面的结构体,我们还可以这样描述:
struct key{
    char *word;
    int count;
}keytab[]={
    {"auto", 0},
    {"break", 0},
    {"case", 0},
    {"char", 0},
    {"const", 0},
    {"continue", 0},
    {"default", 0},
    /* ... */
    {"unsigned", 0},
    {"void", 0},
    {"volatile", 0},
    {"while", 0}
};      //这里加上大括号,表示是一组数据,也就是结构体变量的一个数据,那么这样的表示马上使结构体和一般的变量统一起来了,有所区别的仅仅是每组数据不是单个数据而已.

具体程序请参考原书,因为具体程序在本文中的意义并不大,不做详细描述。

阅读(429) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册