在C语言中,结构体是一种用户自定义的数据类型,可以将不同类型的数据组织起来形成一个新的数据类型。结构体通常由多个变量组成,这些变量可以是不同的数据类型,如整型、浮点型等。结构体的应用广泛,比如可以用来描述一本书的信息、一个人的基本信息、图形界面中控件的属性等。
1. 结构体定义的三种形式
在C语言中,定义结构体有三种形式:普通结构体、匿名结构体和位域结构体。
- 普通结构体:定义时需要指定结构体的名称,在后面使用该结构体的时候需要加上名称。
struct book {
char name[50];
char author[50];
int pages;
float price;
};
- 匿名结构体:没有结构体名称,只有成员名称。适合于只需要使用一次的结构体。
struct {
char name[50];
char author[50];
int pages;
float price;
} b1, b2;
- 位域结构体:可以将一个字节中的各个位分别命名并按需使用,用于对内存空间的优化。
struct {
unsigned int a:1; // 位域a占用1位
unsigned int b:3; // 位域b占用3位
unsigned int c:4; // 位域c占用4位
} bit;
2. 结构体与共同体的区别
结构体和共同体(union)都是由多个数据成员组成的复合类型。它们之间的主要区别在于对内存的使用方式不同。
结构体的所有成员在内存中是依次排列的,每个成员所占用的内存大小加起来就是整个结构体所占用的内存大小。而共同体的所有成员共享同一块内存空间,不同成员之间的值会相互影响。
下面是一个例子:
struct {
int a;
char b;
double c;
} s;
union {
int a;
char b;
double c;
} u;
printf("%dn", sizeof(s)); // 输出16
printf("%dn", sizeof(u)); // 输出8
其中,结构体s中有三个成员,分别占用4、1、8字节的内存空间,总共占用16个字节。而共同体u中虽然有三个成员,但它们共享同一块内存空间,占用最大的double类型所需的8个字节。因此,共同体u只占用8个字节的内存空间。
总之,结构体是一种用户自定义的数据类型,可以将不同类型的数据组织起来形成一个新的数据类型。在C语言中,定义结构体有三种形式:普通结构体、匿名结构体和位域结构体。另外,结构体和共同体都是由多个数据成员组成的复合类型,但它们之间的主要区别在于对内存的使用方式不同。