1.结构体
1.声明一个结构体类型的一般形式为
struct 结构体名
{ 成员列表};
注意不要忽略最后的分号。struct 是声明结构体类型时所必须使用的关键字,不能省略),它向编译系统声明这是一个“结构体类型”,它包括 num、name、sex、age、score、addr等不同类型的数据项。应当说明struct student是一个类型名。
结构体名第一个字母必须大写。
例如:
2.定义结构体类型变量
1.先声明结构体类型再定义变量名
struct Test1 //这是声明
{
int i;
double k;
};
int main(void)
{
struct Test1 s; //这是定义
}
2.再声明类型的同时定义变量
struct 结构体名
{
成员列表
}变量名表列;
struct Test1
{
int i;
double k;
} s;
3.直接定义结构体类型变量
struct
{
成员列表
}变量名表列;
这样定义,在下面的函数中就不能再定义变量了。
注: (1)类型与变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。
(2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
(3)成员也可以是一个结构体变量。
(4)成员名可以和程序中的变量名相同,二者不代表同一对象。
3.结构体变量的引用
不能将一个结构体变量作为一个整体进行输人和输出。只能对结构体变量中的各个成员分别进行输入和输出。引用结构体变量中成员的方式为 结构体变量名.成员名
如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。
对结构体变量的成员可以像普通变量一样进行各种运算。
可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
4.结构体变量的初始化
struct Test1
{
int i;
float j;
};
int main(void)
{
struct Test1 = {1,2.0};
return 0;
}
在初始化时,顺序必须按照结构体成员声明先后次序依次初始化。
在初始化时,可以对部分成员初始化,其他成员为0。
5.sizeof
结构体对齐:为了提高cpu的执行效率。
1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
6.定义结构体数组和结构体数组初始化
struct Test2
{
int i;
char c[20];
};
int main(void)
{
struct Test2 a[] = {{1,"hello"},
{2,"world"}};
return 0;
}
7.用结构体变量和指向结构体的指针做函数参数
当结构体作为函数参数传递时,一般用指针传递,效率快。
当指向结构体中成员时,变量后用 .,指针后用 ->
结构体变量可以整体赋值。
8.链表
链表是由若干个节点组成。
链表节点地址不连续。
phead指向第一个节点。
有头链表 (第一个节点中的值域无用)
无头链表 (第一个节点中的值域有用)