p43 结构体数组和结构体指针
结构体嵌套
-
对于出版日期可以单独为它声明一个结构体类型
struct Date { int year; int month; int day; };
# include<stdio.h> struct Date{ int year; int month; int day; }; // 加分号,因为它是一个完整的声明语句 struct Book{ char title[128]; char author[40]; float price; struct Date date; // 用另一个结构来代替 char publisher[40]; } book = {"带你学C带你飞", "小甲鱼", 48.8, {2017,11,11}, "清华大学出版社" }; // 在一个结构体里面有另一个结构体作为它的一个成员 int main(void) { printf("书名 : %s\n",book.title); printf("作者 : %s\n",book.author); printf("售价 : %.2f\n",book.price); printf("出版日期 : %d-%d-%d\n",book.date.year,book.date.month,book.date.day); printf("出版社 : %s\n",book.publisher); return 0; }
结构体数组
-
上面是描述一本书籍信息的结构体,我们要把它搞成一个系列,那可以使用结构体数组,依次进行存放。
-
结构体数组概念与数组一致,只不过每个数组元素不再是基础的元素类型。每个数组元素都包含该结构体的所有成员。
-
第一种方法是在声明结构体的时候进行定义:
struct 结构体名称 { 结构体成员; } 数组名[长度];
-
第二种方法是先声明一个结构体类型(比如上面Book),再用此类型定义一个结构体数组:
struct 结构体名称 { 结构体成员; }; struct 结构体名称 数组名[长度];
-
-
初始化结构体数组
struct Book book[3] ={
{"《零基础入门学习Python》","小甲鱼",49.5,{2016,11,11},"清华大学出版社"},
{"《零基础入门学习Scratch》","不二如是",49.9,{2017,10,1},“清华大学出版社”},
{"《带你学C带你飞》","小甲鱼",49.9,{2017,11,11},"清华大学出版社"}
};
结构体指针
-
指向结构体变量的指针,称为结构体指针
struct Book *pt; // 声明一个指向Book结构体类型的指针变量pt,必须使用取值运算符 pt = &book;
-
结构体的变量名不是指向结构体的地址。
-
通过结构体指针访问结构体成员有两种方法:
(*结构体指针).成员名 /*通过*运算符对结构体指针,进行一个解引用,像一个普通的结构体运算符去 访问成员*/ 结构体指针 -> 成员名 /* .用于结构体对象,->用于指针*/
-
-
# include<stdio.h>
struct Date{
int year;
int month;
int day;
}; // 加分号,因为它是一个完整的声明语句
struct Book{
char title[128];
char author[40];
float price;
struct Date date;
// 用另一个结构来代替
char publisher[40];
} book = {"带你学C带你飞",
"小甲鱼",
48.8,
{2017,11,11},
"清华大学出版社"
};
// 在一个结构体里面有另一个结构体作为它的一个成员
int main(void)
{
struct Book *pt;
pt = &book;
printf("书名 : %s\n",(*pt).title);
printf("作者 : %s\n",(*pt).author);
printf("售价 : %.2f\n",(*pt).price);
printf("出版日期 : %d-%d-%d\n",pt->date.year,pt->date.month,pt->date.day);
printf("出版社 : %s\n",pt->publisher);
return 0;
}