1.结构体
结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。
1.1 结构体类型的声明
例如描述一个学生:
1.2 结构体的自引用
正确的自引用方法:
1.3 结构体变量的定义和初始化
struct Point
{
int x;
int y;
}p1 = {1,2};
struct Point p3 = {4,5};
struct Stu
{
char name[15];//名字
int age;
};
struct Node
{
int data;
struct Point p;
struct Node* next;
};
int main()
{
int a = 10;
int b = 20;
struct Point p2 = {a, b};
struct Stu s = { "zhangsan", 20 };
struct Stu s2 = { .age=18, .name="如花"};
printf("%s %d\n", s.name, s.age);
printf("%s %d\n", s2.name, s2.age);
struct Node n = { 100, {20, 21}, NULL };
printf("%d x=%d y=%d\n", n.data, n.p.x, n.p.y);
return 0;
}
1.4 结构体内存对齐
为什么会存在结构体内存对齐?
(1)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
(2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界对齐。
1.5 位段
位段的声明和结构是类似的,有两个不同:
(1)位段的成员必须是 int 、unsigned int 、signed int 、char 。
(2)位段的成员名后面有一个冒号和一个数字。
例如: