在C语言中,除了已经定义好的int、char等类型,还支持程序编写者根据自己的需求进行自定义类型,有以下几种:
目录
1.结构体
在C语言中,结构是指一些值的集合,这些值称为成员变量,每个变量可以是不同的类型。
1.1 结构体的声明
struct tag
{
member-list;
}variable;
tag是指结构体的标签,可根据结构体的类型进行自定义;
member-list 即 结构体中的成员列表,每个成员之后用 ; 结束
variable 是 可创建的结构体名称,在此处创建表示该名称的结构体为全局变量
需要注意的是:最后的分号不能省略!!!
特别提一点,在C语言中有一种匿名结构体类型,即不写结构体的tag,如:
struct
{
member-list;
};
这类结构体虽然可以进行创建,但在使用时较为复杂,通常不推荐使用。
1.2 结构体的自引用
struct Node
{
int data;
//struct Node next; // err 引用结构体本身会造成无限循环,错误的
struct Node* next; // 引用同类型的结构体的指针
};
也可使用如下方式进行自引用
typedef struct Node
{
int data;
//struct Node* node; //err 在结构体内部不能使用未定义的类型名
struct Node* next;
}node;
1.3 变量的定义和初始化
struct S
{
char c;
int i;
}s1,s2; // s1,s2为全局变量
int main()
{
struct S s3 = {0}; // 此处定义的s3为局部变量
struct S s4 = {'x', 10}; // 将s4中的c初始化为字符x,将i初始化为10
return 0;
}
1.4 结构体的内存对齐
计算机中,程序是从存储设备调用到内存中再进行使用的,对于十分珍贵的内存空间来说,占用的越小,使用效率越高,处理速度也越快。
结构体的内存对齐有4条特点:
(1) 结构体的第一个成员放在结构体变量在内存中存储位置的0偏移除开始
(2)从第二个成员往后的所有成员,都放在一个对齐数(成员的大小和默认对齐数的较小值)的整数