struct Books
{
	char title[50];
	char author[50];
	char subject[100];
	int book_id;
} book // = {"C 语言", "RUNOOB", "编程语言", 123456};

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个

struct
{
	int a;
	char b;
	double c;
} s1;

struct SIMPLE
{
	int a;
	char b;
	double c;
};
struct SIMPLE t1, t2[20], *t3;

第一个和第二声明被编译器当作两个==完全不同==的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的

此处参考 11-typedef

//也可以用typedef创建新类型
typedef struct
{
	int a;
	char b;
	double c;
} Simple2;
//用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;

结构体的成员可以包含其他结构体,也可以包含==指向自己结构体类型的指针==,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。

//此结构体的声明包含了指向自己类型的指针
struct NODE
{
	char string[100];
	struct NODE *next_node;
};

如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明

struct B; //对结构体B进行不完整声明,将会用在不需要知道这个结构的长度的声明中,如指针

//结构体A中包含指向结构体B的指针
struct A
{
	struct B *partner;
	//other members;
};

//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
	struct A *partner;
	//other members;
};

访问结构成员

使用成员访问运算符 (.) 访问结构成员

结构作为函数参数

把结构作为函数参数,传参方式与其他类型的变量或指针类似

指向结构的指针

参考 5-指针 pointer 定义指向结构的指针与定义指向其他类型变量的指针相似 struct Books *struct_pointer; 我们可以在上述定义的指针变量中存储结构变量的地址 struct_pointer = &Book1; 使用 -> 运算符来通过结构指针访问结构的成员 struct_pointer->title;