第十四章 结构和其他数据形式
程序清单14.2 manybook.c程序
其中有一行while条件的表达式:while(count < MAXBKS && gets(library[count].title) != NULL && library[count].title[0] != '/0')
这句话写得真是很好。用别的语句都是不好替代的。第一个条件,count < MAXBKS,判断总共的书的册书是不是超过最大限制了。第二个条件,gets(library[count].title) != NULL,首先,它的作用不仅是判断,还有个gets用来输入的关键字,也就是说是等待输入,然后判断输入的是不是文件结束符之类的,如果在最后运行的时候输入ctrl-z(windows Dev-C++),这个条件就不符合,跳出这个while循环;第三个条件library[count].title[0] != '/0',检测字符串的第一个字符是否为空字符,如果用户在输入行的开始就按了回车键,将输入空字符串,将结束循环。
在while下面的程序块中,接收并处理完应有的数据后,还有个清空输入行的操作:
while(getchar() != '/n')
continue;
例子清单14.4 friends.c
struct guy *him;
him = &fellow[0]; //him为指向结构的指针
him->income和(*him).income的内容一样。
结构体的特性:
现在的c允许把一个结构赋值给另一个结构,不能对数组这样做。也就是说,如果n_data和o_data是同一类型的结构,可以像下面这样做: o_data = n_data;
这就使o_data的每个成员都被赋成n_data相应成员的值,即使有一个成员是数组也照样完成赋值。
结构,还是指向结构的指针:
假设必须写一个与结构有关的函数。应该用结构指针作为参数,还是用结构作为参数和返回值呢?每种方法都有它的长处和不足。
把指针作为参数的方法的两个优点是:它既工作在较早的c实现上,也工作在较新的c实现上,而且执行起来很快;只需传递一个单个地址。 缺点是缺少对数据的保护。不过ANSI C中新增的const限定词解决了这个问题。
把结构作为参数传递的一个优点是函数处理的是原始数据的副本,这就比直接处理原始数据安全。
通常,程序员为了追求效率而使用结构指针作为函数参数;当需要保护数据、防止意外改变数据时对指针使用const限定词。
传递结构值是处理小型数据最常用的方法。