结构声明(Struct Declaration)
Struct Declaration(结构声明),即描述 struct 的组织布局。
struct book {
char title[MAXTITLE];
char author[MAXAUTL];
float value;
}
结构变量(Struct Variable)
Struct Variable(结构变量),即使用某个 struct 类型的变量。
变量定义
struct book my_library;
struct book my_dickens;
struct book * my_ptbook;
// 直接定义并使用
struct book {
char title[MAXTITLE];
char author[MAXAUTL];
float value;
} my_ptbook;
struct { // 省略 struct 的标记 —— book
char title[MAXTITLE];
char author[MAXAUTL];
float value;
} my_ptbook;
变量初始化
struct book my_ptbook = {
"Computer Sicence",
"John",
12.3
};
struct book your_ptbook = my_ptbook; //
// 注意事项:
// 1)对于 Static Storage Duration 的 struct 初始化,必须使用常量;
// 2)对于 Automatic Storage Duration 的 struct 初始化,必须使用常量;
// -----------------------------------------------------------------------------
struct book my_ptbook = {
.value = 15.4,
.author = "Tom",
13.2
}
// 补充说明:
// 1)根据需要来初始化变量,这是 C99 C11 新增特性(designated initializer);
// 2)最后 .value 的值为 13.2,因为其紧随 .author 之后;
成员访问
my_ptbook.title
s_get(my_ptbook.author)
scanf("%f", &my_ptbook.value) // & 优先级高于 .
结构数组(Struct Array)
声明结构数组
struct book my_ptbook[MAXBKS] my_ptbook[0].author // 获取某个元素的某个值
嵌套结构
struct name {
char first[MAX];
char last[MAX];
}
struct guy {
struct name handle;
char favfood[LEN];
char job[LEN];
float income;
}
// 初始化
struct guy fellow = {
{"Ewen", "Villard"},
"grilled salmon",
"personality coach",
68112.00
}
匿名结构
struct person {
int id;
struct {char first[20]; char last[20];}; // 匿名结构
} ted
ted.first; // 访问变量
结构指针
struct guy fellows[LEN] = {{}, ...};
struct guy * him;
him = &fellows[0]; // 注意,fellows[0] 是个 struct,而非地址
(*him).income == him->income; // 这两种写法是等价的
向函数传递结构
传递结构成员
double sum(double x, double y) {...}
double(foo.bankfund, foo.savefund)
传递结构地址
double sum(const struct funds * money) {...}
double(&foo)
传递结构本身
double sum(struct funds money) {...}
double(foo)
复合字面量
直接将赋值赋予变量(或函数实参)
// 将字面量赋予变量
readfirst = (struct book) {"A", "B", 1.2}
// 将字面量作为实参
foo((struct book) {"A", "B", 1.2}) // 传入字面量
foo(&(struct book) {"A", "B", 1.2}) // 传入地址
保存结构到文件
fwrite(&primer, sizeof(struct book), 1, pbooks);