第十九章(自定义类型:结构体)
1. 结构体类型的声明
2. 结构体变量的创建和初始化
3. 结构成员访问操作符
4. 结构体内存对⻬
5. 结构体传参
一、结构体类型的声明
1.1结构体的声明
struct student
{int age;int id[10];char name[10];
};
1.2 结构体变量的初始化
struct student
{int age;char id[10];char name[10];
};int main()
{// 1. 按照顺序初始化struct student s = { 18,"22021111","张三" };printf("%d %s %s\n", s.age, s.id, s.name);//2. 不按顺序初始化 struct student s1 = { .id = "2222555",.age = 28,.name = "王五"};printf("%d %s %s\n", s1.age, s1.id, s1.name);return 0 ;
}
三、这里我们在原来的知识中已经介绍过了
这里我们需要注意的是,我们在使用结构体的时候,尽量要给结构体变量命名。
四、结构体内存对齐
我们通过上边的学习已经初步掌握了结构体的基本使用了。
现在我们深入讨论一个问题:计算结构体的大小。
这也是一个特别热门的考点:结构体内存对齐
4.1 结构对齐
我们首先需要知道对齐规则
注意:这里需求到一个偏移量的知识
我们来举例子练习一下
#include<stdio.h>
struct s1
{char a1;int a2;int a3;
};
int main()
{printf("%zd\n", sizeof(struct s1));return 0;
}
struct s3
{char nun1;int nun2;double nun3;
};
int main()
{printf("%zd\n", sizeof(struct s3));return 0;
}
struct s3
{char nun1;int nun2;double nun3;
};struct s4
{char b1;struct s3;int b2;
};
int main()
{printf("%zd\n", sizeof(struct s4));return 0;
}
五、结构体传参
我们从两方面解释
1.传值
2.传址
struct s1
{int a ;char name[20];
};
void print_data(struct s1 num)//传值
{num.a = 20;printf("%d\n", num.a);
}
void print_score(struct s1* pr) //传址
{pr->a = 30;printf("%d\n", pr->a);}
int main()
{struct s1 num = { 10,"lisi" };print_data(num);printf("%d\n", num.a);print_score(&num);printf("%d\n", num.a);return 0;
}
结论:在我们传参的时候,要传结构体的地址