让我们看看上一个程序,在他的结构内只有一本书,显然是远远不够的,老板娘需要的是一个能有许多书的书店,那我们就要把book程序扩展称为可以处理更多的书,显然,每一本书都可以用book结构进行描述,而当要描述俩本书的时候,老板娘就会输入俩本书的信息,我们就需要俩个变量,以此类推,需要处理多少的书我们就可以使用一个这个结构的数组,我会再举一个例子,这个与上一个例子相对应,可以与之相对应着看
#include
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 100 /* 最多可以容纳的书籍数目 */
struct book { /* 建立book的结构模板 */
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
int main (void)
{
struct book library[MAXBKS]; /* book 结构数组 */
int count = 0;
int index;
printf ("Plesae enter the book title \n");
printf ("Press [enter] at thne start of a line to stop \n");
while (count < MAXBKS && gets(library[count].title) != NULL && library[count].title[0] != '\0')
{
printf ("Now enter the author \n");
gets (library[count].author);
printf ("Now enter the value \n");
scanf ("%f", &library[count++].value); /* 这里用count++来转换成下一组信息 */
while (getchar() != '\n')
continue; /* 清空输入行 */
if (count < MAXBKS)
printf ("Enter then next title \n");
}
if (count > 0) /* 检测输入的信息数量为真 则显示 */
{
printf ("Here is the list of your books : \n");
for (index = 0; index < count; index++) /* 循环地显示信息 */
printf ("%s by %s : $%.2f \n", library[index].title, library[index].author,
library[index].value);
}
else /* 为假则显示错误信息 */
printf ("No Books? Too bad\n");
return 0;
}
——————————————————————————————————————————————————
那我可以运行一下(感觉穿不了照片欸 (~ ̄▽ ̄)→))* ̄▽ ̄*)o)手打
Plesae enter the book title
Press [enter] at thne start of a line to stop
My life as a Budgie
Now enter the author
Mack Zackles
Now enter the value
12.95
Enter then next title
.... more ........
Here is the list of your books :
My life as a Budgie by Mack Zackles : $12.95
Thought and unthought Rethought by kindra Schlagmeyer : $43.50
The Business of a Bee by Buster Downsize : $19.25
.......more
——————————————————————————————————————————————————
首先,我们看看如何声明结构数组以及我们是如何访问各个成员的。
——————————
声明结构数组-是和其他简单的类型数组是一样的
sturct book library[MAXBKS];
这条语句就声明了library为一个菊耦MAXBKS个元素的数组,而在这个数组中每一个元素都是book类型的结构,因此,library[0]就是一个book结构,library[1]也是一个book结构。以此类推。其实我想画一个图的,谁能教我怎么上图( ̄Q ̄)╯,[记住,library 它不是结构名,他只是元素类型为struct book结构的数组名。]
在这之后我们再来看看我们是如何标记我们的成员以方便我们把它们单独提取出来。
标记结构数字的成员可以采用老方法,在结构名后(虽然我刚才说了library不是结构名但是library[0]就恰好是结构名了)面加上一个点运算符,然后接着成员名,就像这样:
library[0].value /*第1个数组元素的value成员*/
library[4].title /*第5个数组元素的title成员*/
注意,数组下标是更在library后面,而不是跟在成员名的后面;
library.value[2] //是错误的
library[2].value //正确
使用library[2].value 的原因是library[2]是结构变量名,就像library[1]是另外一个结构变量名一样。
那我再问一个问题,下面这个表达式你怎么解读:
library[2].title[2]
这是由第 3 个结构 (library[2]部分) 描述的书本的名称的第 5 个字符 (title[4]部分). 在本例中即为字符 B. 这个例子指出, 点运算符右边下标作用亍各个成员, 而点运算符 左边的下标作用亍结构数组.
————————————————————————————————————————————————————————————————————————————
那我总结一下,我们看看下面的序列
library /*book结构数组*/
library[2] /*数组元素,因此是一个book结构*/
library[2].title /*char数组,是library[2]里的title成员*/
library[2].title[4] /*是成员title里面的一个字符*/
———————————————————————————————————————————————————