定义结构
结构体关键字为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;
}
如此声明,两个结构体便实现了互相包含。