⽬录:
- 结构体类型的声明
- 结构体变量的创建和初始化
- 结构成员访问操作符
- 结构体内存对⻬
- 结构体传参
- 结构体实现位段
1. 结构体类型的声明
. 结构体类型的声明
前⾯我们在学习操作符的时候,已经学习了结构体的知识,这⾥稍微复习⼀下。
1.1 结构体回顾
结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.1.1 结构的声明
cpp
struct tag
{
member-list;
}variable-list;
例如描述⼀个学⽣:
cpp
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢
匿名结构体类型:
struct
{
char c;
int i;
double d;
}s;
int main()
{
return 0;
}
struct 匿名结构体类型把名字去掉,变量直接在}后创建:"s";
也可以初始化
cpp
struct
{
char c;
int i;
double d;
}s={'x',100,3.14};
int main()
{
printf("%c %d %lf\n",s.c,s.i,s.d);
return 0;
}
匿名结构体类型只能用一次;因为该结构没有名字
struct
{
char c;
int i;
double d;
}s;
struct
{
char c;
int i;
double d;
}*ps;
int main()
{
ps = &s;
return 0;
}
这样会报错,编译器会将上述两种声明当做完全不同的两个类型,所以是非法的
匿名结构体类型如果没对结构体进行重命名的话,基本只能使用一次
cpp
typedef struct
{
char c;
int i;
double d;
}S;
int main()
{
S s;
return 0;
}
意义不大
结构的自引用
数据结构:其实是数据在内存的存储和组织的结构
数据结构有多种,有的线性,树桩,图
线性:顺序表,链表,栈,队列
树形:二叉树
主要讲链表:
假设要在内存中存贮1 2 3 4 5
- 顺序表----数组
2.链表,每一份节点不仅携带数值还要有能力找到下一个数值
事实上还要有能力存放下一个节点相关的数据

那么对于链表节点的定义:
struct Node
{
int date;
struct Node n;
};
这样不合理。因为对于sizeof(struct Node)里边不仅包含date整形还包含一个跟他一样大的struct
后面无穷大
可以这样,存整形和下个节点的地址,最后一个存空指针
加上重命名
cpp
typedef struct Node
{
int date;
struct Node* next;
}Node;
int main()
{
Node s;
}
对于
能不能把struct搞到掉
typedef struct Node
{
int date;
Node* next;
}Node;
还不能的
因为还没完成重命名
同事匿名的结构体类型是不能完成结构体的自引用的