目录
1、结构模板
1. 建立结构声明
2. 定义结构变量
3. 访问结构成员
4. 初始化结构
声明结构数组
声明和初始化结构指针
1、结构模板
1. 建立结构声明
struct book{char title[MAXTITL];char author[MAXAUTL];float value;
};
该声明描述了一个又两个字符数组和一个 float 类型变量组成的结构,该声明并未创建实际的数据对象,只描述了该对象由什么组成。
关键字 struct 表明跟在其后的是一个结构,后面是一个可选标记(该例是book),我们在后面的程序中可以这样声明:
struct book library;
这把 library 声明为一个使用book结构布局的结构变量。
在结构声明中,用一对花括号括起来的是结构成员列表。每个成员都用自己的声明来描述。成员可以是任意一种C的数据类型,甚至可以是其他结构。 右花括号后面的分号是声明所必须的,表示结构布局定义结束。
2. 定义结构变量
创建结构变量:
struct book library;
编译器执行这行代码便创建了一个结构变量library。编译器使用book模板为该变量分配空间。
在结构变量的声明中,struct book 所起的作用相当于一般声明中的 int 或 float 。例如可以定义两个 struct book 类型的变量或者指向它的指针:
struct book doyle, panshin, *ptbook;
下面的声明:
struct book library;
是下面声明的简化:
struct book{char title[MAXTITL];char author[MAXAUTL];float value;
}library;
声明结构的过程和定义结构变量的过程可以组合成一个步骤,组合后的结构声明和结构变量定义不需要使用结构标记。然而,如果打算多次使用结构模板,就要使用带标记的形式。
struct {char title[MAXTITL];char author[MAXAUTL];float value;
}library;
3. 访问结构成员
使用结构成员运算符——点(.)访问结构中的成员。例如,library.value 即访问 library 的 value 部分。可以像使用任何 float 类型变量那样使用 library.value 。
假如创建了一个结构体指针,那么与上面的有所不同,用 ->符号访问结构体指针
struct book{char title[MAXTITL];char author[MAXAUTL];float value;int* ptr;
}library;
library->ptr即访问 library 的 ptr 部分
4. 初始化结构
初始化结构有两种方法,一个是按顺序赋值,另一种是使用指定初始化器。
按顺序初始化,假如有下面的结构体:
struct book{char title[MAXTITL];char author[MAXAUTL];float value;}library;
那么给这个结构体初始化就像这样:
struct book library = {"shudannan","libai",10.0
};
还有一种是使用指定初始化器。C99和C11为结构提供了指定初始化器,结构的指定的初始化器使用点运算符和成员名。
struct book library = {.value = 10.0,.title = "shudaonan",.author = "libai"
};
另外,对特定成员的最后一次赋值才是它实际获得的值。例如:
struct book gift = {.value = 18.9,.author = "libai",10
};
赋给value的值是10,因为它在结构声明中紧跟在author成员之后。新值10取代了之前的18.9。
声明结构数组
声明结构数组和声明其他类型的数组类似。
struct book library[MAX];
以上代码把library声明为一个内含MAX个元素的数组。数组的每个元素都是一个book类型的结构。因此,library[0]是第1个book类型的结构变量,library[1]是第2个book类型的结构体变量。数组名library本身不是结构名,它是一个数组名,该数组中的每个元素都是struct book类型的结构变量。
标识结构数组的成员
library //一个book结构的数组
library[2] //一个数组元素,该元素是book结构
library[2].title //一个char数组(library[2]的title成员)
library[2].title[4] //数组中library[2]元素的title成员的一个字符
声明和初始化结构指针
假设有如下结构
struct guy
{struct name handle;char favfood[10];float income;
};
struct guy * him;
首先是关键字struct,其次是结构标记guy,然后是一个星号,其后跟着指针名。这个语法和其他指针声明一样。
该声明并未创建一个新的结构,但是指针him可以指向任意现有的guy类型的结构。例如,如果barney是一个guy类型的结构变量,可以这样写:
him = &barney;
和数组不同,结构变量名并不是结构变量的地址,因此要在结构变量名前加上&运算符。
用指针访问结构成员
用指针访问结构成员,可以使用->运算符。him->income既是访问结构体中的value成员。
还有一种方法
barney.income == (*him).income == him->income // 假设him == &barney
如果him是指向guy类型结构barney的指针,上面的关系恒成立,因为 * 和 & 是一对互逆运算符。