建立结构声明
struct book
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
};
定义结构变量
结构包括结构布局和结构变量两部分的含义,例如,在
struct book dickens;
中,结构变量是dickens,结构布局是book。在结构变量的声明中,struct book所起的作用相当于一般声明中的int或float,例如。可以定义两个struct book类型的变量,甚至是指向struct book类型的指针:
struct book doyle,panshin,*ptbook;
对于创建图书馆目录的例子,下面的声明:
struct book library;
是以下声明的简化:
struct book
{
char title[MAXTITL];
char author[AXAUTL];
float value;
}library;
也就是说,声明结构的过程和定义结构变量的过程可以组合成一个步骤。
初始化结构
一般使用一对花括号中括起来的初始化列表进行初始化,各初始化项目用逗号分隔,初始化一个静态存储期的结构,初始化列表中的值必须是常量表达式。
访问结构成员
使用结构成员运算符——(.)访问结构中的成员,例如,library.value即访问Library的value部分,可以像使用任何float变量那样使用library.value.虽然library是一个结构,但是library.value是一个float类型的变量。例如,scanf("%f",·····),需要一个float变量类型的地址,而&library.float正好符合这个要求,.比&的优先级高,因此这个表达式和&(library.float)一样。
结构的初始化器
结构的指定初始化器使用点运算符和成员名标识的元素
结构数组
声明结构数组
struct book library[MAXBKS];
以上代码把library 声明为一个内含MAXBKS个元素的数组。数组的每个元素都是一个book类型的数组,因此,library[0]是第一个book类型的结构变量,library[1]是第二个book类型的结构变量····,数组名library本身不是结构名,它是一个数组名,该数组的每个元素都是struct book类型的结构变量。
也就是library[0]中包含了library[0].title, library[0].author, library[0].value。
标识结构数组中的成员
为了标识结构数组中的成员,可以采用访问单独结构的规则:在结构名后面加一个点运算符,再在点运算符后面写上成员名。
library[0].value
library[1].author
library //一个book结构的数组
library[2] //一个数组元素,该元素是book结构
library[2].title //一个char数组(library[2]的title成员)
library[2].title[4] //数组中library[2]元素的title成员的一个字符
while(getchar()!='\n')
continue; /*清理输入行*/
上述的代码弥补了scanf()函数遇到空格和换行符就结束读取的问题。
指向结构的指针
声明和初始化结构指针
struct guy * him;
指针him现在可以指向任意现有的Guy类型的结构。
例如,如果barery是一个guy类型的结构变量,可以这样写:
him=&barery;
和数组不同的是,结构变量名不是结构的地址,所以要在结构变量名之前加上&运算符。
用指针访问成员
指针him指向结构变量fellow[0],如何通过him 获得fellow[0]成员的值,
第一种方法是:
使用 -> 运算符
如果him==&bareny,那么him->income即是bareny.income
如果him==&fellow[0],那么him->income即是fellow[0].income
第二种方法是:
如果him==&fellow[0]那么him==fellow[0],因为&和是一对互逆运算符,因此,可以做以下替代:fellow[0].income==(*him).income必须使用圆括号,因为.运算符比星号运算符的优先级高。
其他结构特性
getinfo()函数把结构的信息从自身传递给main().返回类型是void.
makeinfo()函数使用双向传输方式传送信息。返回类型是void.
showinfo()函数使用一个指针定位待打印的信息。因为该函数不改变数组的内容,所以将其声明为const。