C程序设计语言(K&R)第六章学习笔记
2014-08-07 19:12
357 查看
6.1
点是最基本的对象,假定用 x 与 y 坐标表示它,且 x、y 的坐标值都为整数。
采用结构存放这两个坐标:
struct point {
int x;
int y;
};
结构可以嵌套。我们可以用对角线上的两个点来定义矩形:
struct rect {
struct point pt1;
struct point pt2;
};
struct rect screen;
可以用语句 screen.pt1.x 引用 screen 的成员 pt1 的 x 坐标。
6.2
struct point *pp;
将pp定义为一个指向struct point 类型对象的指针。如果 pp 指向一个 point 结构,那么 *pp 即为该结构,而 (*pp).x 和 (*pp).y 则是结构成员。可以按照下例中的方式使用 pp:
struct point origin, *pp;
pp = &origin;
printf("origin is (%d, %d)\n", (*pp).x, (*pp).y);
其中,(*pp).x 中的圆括号是必须的,因为结构成员运算符 “.” 的优先级比 “*” 的优先级高。
结构指针的使用频度非常高,为了使用方便,C 语言提供了另一种简写方式。假定 p 是一个指向结构的指针,可以用
p->结构成员
这种形式引用相应的结构成员。
6.4
我们无法简单的通过下列表达式计算中间元素的位置:
mid = (low + high) / 2; /* wrong */
这是因为,两个指针之间的加法运算是非法的。但是,指针的减法运算却是合法的。high-low的值就是数组元素的个数,
因此,可以用下列表达式:
mid = low + (high-low) / 2;
点是最基本的对象,假定用 x 与 y 坐标表示它,且 x、y 的坐标值都为整数。
采用结构存放这两个坐标:
struct point {
int x;
int y;
};
结构可以嵌套。我们可以用对角线上的两个点来定义矩形:
struct rect {
struct point pt1;
struct point pt2;
};
struct rect screen;
可以用语句 screen.pt1.x 引用 screen 的成员 pt1 的 x 坐标。
6.2
/* makepoint: make a point from x and y components */ struct point makepoint(int x, int y) { struct point temp; temp.x = x; temp.y = y; return temp; } struct rect screen; struct point middle; struct point makepoint(int, int); screen.pt1 = makepoint(0, 0); screen.pt2 = makepoint(XMAX, YMAX); middle = makepoint((screen.pt1.x + screen.pt2.x)/2, (screen.pt1.y + screen.pt2.y)/2); /* addpoints: add two points */ struct addpoint(struct point p1, struct point p2) { p1.x += p2.x; p1.y += p2.y; return p1; } /* ptinrect: return 1 if p in r, 0 if not */ int prinrect(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; } #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) /* canonrect: canonicalize coordinate of rectangle */ struct rect canonrect(struct rect r) { struct rect temp; temp.pt1.x = min(r.pt1.x, r.pt2.x); temp.pt1.y = min(r.pt1.y, r.pt2.y); temp.pt2.x = max(r.pt1.x, r.pt2.x); remp.pt3.y = max(r.pt1.y, r.pt2.y); return temp; }如果传递给函数的结构很大,使用指针方式的效率通常比复制整个结构的效率要高。结构指针类似于普通变量指针。
struct point *pp;
将pp定义为一个指向struct point 类型对象的指针。如果 pp 指向一个 point 结构,那么 *pp 即为该结构,而 (*pp).x 和 (*pp).y 则是结构成员。可以按照下例中的方式使用 pp:
struct point origin, *pp;
pp = &origin;
printf("origin is (%d, %d)\n", (*pp).x, (*pp).y);
其中,(*pp).x 中的圆括号是必须的,因为结构成员运算符 “.” 的优先级比 “*” 的优先级高。
结构指针的使用频度非常高,为了使用方便,C 语言提供了另一种简写方式。假定 p 是一个指向结构的指针,可以用
p->结构成员
这种形式引用相应的结构成员。
6.4
#include <stdio.h> #include <ctype.h> #include <string.h> #define MAXWORD 100 int getword(char *, int); struct key *binsearch(char *, struct key *, int); /* count C keywords; pointer version */ int main() { char word[MAXWORD]; struct key *p; while (getword(word, MAXWORD) != EOF) if (isalpha(word[0])) if ((p=binsearch(word, keytab, NKEYS)) != NULL) p->count++; for (p = keytab; p < keytab + NKEYS; p++) if (p->count > 0) printf("%4d %s\n", p->count, p->word); return 0; } /* binsearch: find word in tab[0] ... tab[n-1] */ struct key *binsearch(char *word, struct key *tab, int n) { int cond; struct key *low = &tab[0]; struct key *high = &tab ; struct key *mid; while (low < high) { mid = low + (high-low)/2; if ((cond = strcmp(word, mid->word)) < 0) high = mid; else if (cond > 0) low = mid + 1; else return mid; } return NULL; }
我们无法简单的通过下列表达式计算中间元素的位置:
mid = (low + high) / 2; /* wrong */
这是因为,两个指针之间的加法运算是非法的。但是,指针的减法运算却是合法的。high-low的值就是数组元素的个数,
因此,可以用下列表达式:
mid = low + (high-low) / 2;
相关文章推荐
- 个人学习C程序设计语言(第2版·新版)笔记
- C程序设计语言(K&R)第五章学习笔记
- C程序设计语言(K&R)——学习笔记
- C程序设计语言(K&R)学习笔记--5.extern小结
- C程序设计语言(K&R)第七章学习笔记
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第六章 选择结构 课后题6-4&6-6&6-7
- C程序设计语言(K&R)学习笔记--4.const小结
- C程序设计语言(K&R)第四章学习笔记
- C程序设计语言(K&R)学习笔记--9.输入输出
- C程序设计语言(K&R)第三章学习笔记
- C程序设计语言(K&R)学习笔记:1.虎纠话之攀讲
- C程序设计语言(K&R)学习笔记--8.结构体
- C程序设计语言(K&R)学习笔记--7.include,define,ifndef综合应用demo
- K&R学习笔记 第六章
- C程序设计语言(K&R)笔记
- C程序设计语言学习笔记(二)
- <<C语言深度剖析>>学习笔记之五:指针与数组
- c程序设计语言学习笔记
- JSP&Servlet学习笔记-第六章:使用JSP
- C程序设计语言——第2章学习笔记