在c语言天气的温度可以用double类型的变量来表示,表述人的名字可以用String的数据类型接收,但是如果我们要表示一个学生的话他有年龄名字等数据类型,那么我们无法用基本数据类型来表示了,所有就有了结构体这个数据类型。结构体就相当于一堆不同数据类型的集合,假如我们要表示一个学生的结构体的语法表示为
struct stu{
char[10] name;
int age;
};
结构体的变量的创建有两种方式一是定义结构体的时候创建二是在像基本数据类型那样创建
struct stu{
char[10] name;
int age;
}stu1;
struct stu stu2;
定义结构体是里面的类型没有限制也可以放结构体类型的变量也可以放指针
struct stu{
int age;
char[10] name;
struct chengji cj;
struct chengji *cj;};
结构体有两种访问形式意识通过创建变量.成员的方式访问这类似面向对象编程的对象访问成员还有就是通过结构体指针*cj->成员来访问。
结构体也可以不完全声明,就是省略结构体标签,但是改用法只能用一次因为声明了两个编译器就无法区分了。
truct {
int a; char b; float c;
}a[20], *p;
每个数据类型都有大小,结构体当然也不例外,结构体的大小并不是结构体成员简单相加而是遵循对齐规则⾸先得掌握结构体的对⻬规则:1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。3.结构体总⼤⼩为最⼤对⻬数结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的 整数倍。4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。
比如我们看着一段代码
#include<stdio.h>
struct s1
{
int a;
char b;
float c;
}x;
int main() {
printf("%d",sizeof(x));
return 0;
}
从偏移量0开始a占四个字节然后跟这b因为b的字节是1所以是任何数的倍数此时偏移量编程4c的字节是4所以下次偏移量为4的倍数便是8;最后结构体的大小是4的倍数为12;
我们也可以修改对齐数通过#pragma
#include <stdio.h>
#pragma pack(1)//设置默认对⻬数为1
struct S
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的对⻬数,还原为默认
int main()
{
printf("%d\n", sizeof(struct S));
return 0;
}
结构体可以通过位段来节省空间
struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};