C语言中的结构体
在
C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为
变量、
指针或
数组等,用以实现较复杂的
数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
[1]
定义与声明
1
2
3
|
struct
tag {
member-list
} variable-list ;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//同时又声明了结构体变量s1
//这个结构体并没有标明其标签
struct
{
int
a;
char
b;
double
c;
} s1;
//同上声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct
SIMPLE{
int
a;
char
b;
double
c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct
SIMPLE t1, t2[20], *t3;
//也可以用typedef创建新类型
typedef
struct
{
int
a;
char
b;
double
c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;
|
1
2
3
4
5
6
7
8
9
10
|
//此结构体的声明包含了其他的结构体
struct
COMPLEX{
char
string[100];
struct
SIMPLE a;
};
//此结构体的声明包含了指向自己类型的指针
struct
NODE{
char
string[100];
struct
NODE *next_node;
};
|
1
2
3
4
5
6
7
8
9
10
11
|
struct
B;
//对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct
A{
struct
B *partner;
//other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct
B{
struct
A *partner;
//other members;};
|
结构体作用
结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit
字长的CPU,对这类型的CPU取4个
字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的
编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过
预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
[1]
规则:
1、
数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
[1]
2、结构(或联合)的整体对齐规则:在
数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
[1]
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。