结构体

结构体

定义结构 结构体关键字为struct和结构体名组成。 struct语句定了一个包含多个成员的新的数据类型,struct语句格式如下: struct tag { member-list member-list member-list ... } variable-list ;

定义结构

结构体关键字为struct和结构体名组成。
struct语句定了一个包含多个成员的新的数据类型,struct语句格式如下:

struct tag {
	member-list
	member-list
	member-list
	...
} variable-list ;

tag是结构体标签(即 新数据类型的名称)。
member-list是结构体内部变量。
variable-list是结构变量,可以指定一个或多个结构变量。 ^942df6

示例

struct Books {
	char title[50];
	char author[50];
	int book_id;
} book;

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

第一种声明

^4b1bb8

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

^335ebe

此声明声明了具有三个变量的结构体,同时又声明了结构体变量s1,同时,这个结构体并没有表明标签。[[结构体#^942df6]]
该结构体因为没有结构体标签,意味着不能再去声明其他该结构体类型的变量,只有s1可以使用。

第二种声明

^b3b0f2

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

^40b1c8

此声明声明了具有三个变量的结构体,结构体标签为SIMPLE,但是没有声明结构体变量。
因此,此声明类型的结构体,需要先声明一个结构体变量方可使用。

struct SIMPLE test;
test.a = 10;
test.b = "Hello";
test.c = 1.2f;

第三种声明

typedef struct {
	int a;
	char b;
	double c;
} simple;

此声明声明了新类型,包含三个变量,同时类型名为simple

在使用上,如此声明与第二种声明的区别在于:

struct SIMPLE t1;
simple t2;

可以看出,用typedef可以使代码更简练易读。

现在可以用simple作为类型来声明新的结构体变量。

simple u1, u2[20], *u3;

第四种声明

typdef struct Books {
	char title[50];
	char author[50];
	int book_id;
} books;

这种声明方式,直接声明了新类型books,可以这样来初始化数据类型:

books book;

在上面的声明中,第一个[[结构体#^4b1bb8]]和第二个[[结构体#^b3b0f2]]声明被编译器当作两个完全不同的类型,即使他们的内部成员是一样的。
如果:

struct SIMPLE *t1;
t1 = &s1;

这样是非法的,编译器会报错。


结构体变量初始化

示例

struct {
	char title[50];
	char author[50];
	int book_id;
} book = { "平凡的世界", "路遥", 20 };
struct Books {
	char title[50];
	char author[50];
	int book_id;
} book = { "平凡的世界", "路遥", 20 };
struct Books {
	char title[50];
	char author[50];
	int book_id;
};
struct Books book = { "平凡的世界", "路遥", 20 };
typedef struct Books {
	char title[50];
	char author[50];
	int book_id;
};
struct Books book = { "平凡的世界", "路遥", 20 };
typedef struct Books {
	char title[50];
	char author[50];
	int book_id;
} books;
books book = { "平凡的世界", "路遥", "20" }; 

进阶用法

结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,通常是为了实现更高级的数据结构。

struct COMPLEX {
	char string[100];
	struct SIMPLE a;
}

此结构体声明包含了其他结构体。


struct NODE {
	char string[100];
	struct NODE *next_node;
};

此结构体声明包含了指向自己类型的指针。


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

struct B; // 对结构体 B 进行不完整声明

struct A {
	struct B *partner;
};

struct B {
	struct A *partner;
}

如此声明,两个结构体便实现了互相包含。

LICENSED UNDER CC BY-NC-SA 4.0
Comment