结构体类型的介绍及创建
结构体类型的介绍
在C语言中,经常需要描述一个复杂对象,例如学生,书籍,这类对象一般包含多个信息,例如学生包含学号、名字,所属学院等等,书籍则包括版本号、书名、出版社等等,这些不能单独用int、char、float等类型定义的,我们就用结构体来描述,例如:
struct student
{
char name[10];//学生名字
char studynum[20];//学号
};
结构体类型的创建和初始化
了解了结构体类型的作用,我们再来了解如何创建并初始化一个结构体
结构体的创建
首先我们需要了解结构体创建的关键字:struct
结构体的基本结构如下:
struct 名字
{
//结构体成员定义在大括号中
};//这里有一个分号不能忘记
这里我们需要注意,结构体的类型是struct 名字这个整体,例如上面的struct student
我们也可以使用typedef来重命名结构体
typedef struct student
{
char name[10];
char num[20];
char sex;
}stu;//使用typedef将struct student类型重命名为stu类型
结构体还能匿名创建:
struct
{
char name[20];
char sex;
char num[20];
}x;//使用这个匿名结构体创建x这个变量
struct
{
char name[20];
char sex;
char num[20];
}s1,*p;//使用这个匿名结构体创建了s1,p这两个变量
注意,匿名结构体在不重命名的情况下只能使用一次,变量只能在创建匿名结构体时同时创建变量
同时需要注意,对于上述代码,p = &x; 这条语句是错误的,因为两个变量类型是不相同的,编译器会报错
结构体的初始化
首先我们需要了解两个结构体成员访问操作符 . 和 ->,这两个操作符用来访问结构体当中的成员变量,其中->用于指针访问结构体成员,我们结合初始化的例子一起理解:
#include <stdio.h>
struct student
{
char name[20];//名字
int age;
char num[20];//学号
char sex[5];//性别
};
int main()
{
struct student stu1 = { "zhangsan",19,"2204020304",'男' };//这里在创建时直接初始化
struct student stu2 = { .age = 20,.name = "lisi",.num = "2204030405",.sex = "女"};//使用.操作符改变初始化顺序
printf("%d\n", stu1.age);//使用 . 操作符访问stu1中的变量age
printf("%s\n", (&stu1)->name);//使用 -> 操作符访问stu1中的变量name,因为->只能操作指针,所以需要先取出stu1的地址再使用
printf("%d\n", stu2.age);//使用 . 操作符访问stu2中的变量age
printf("%s\n", (&stu2)->sex);//使用 -> 操作符访问stu2中的变量sex
return 0;
}
打印结果如下:
结构体的内存对齐
当我们想求一个结构体所占空间的大小时,首先需要明白,结构体的大小并不简单是其所有成员变量所占空间大小之和,这其中还涉及结构体的内存对齐的规则,例如:
struct s
{
char b;//1byte
int age;//4byte
float num;//4byte
int x;//4byte
};
对于上面这个结构体,其所占空间大小并不是1+4+4+4=16个字节,而是需要根据内存对齐的规则计算
内存对齐的规则:
1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处
2.其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处
对⻬数 编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值
VS 中默认的值为 8
Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩
3结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的
整数倍
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构
体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍
下面根据例题实际计算:
//练习1
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
//练习2
struct S2
{
double d;
char c;
int i;
};
printf("%d\n", sizeof(struct S2));
//练习3-结构体嵌套问题
struct S3
{
char c1;
struct S2 s2;
double d;
};
printf("%d\n", sizeof(struct S3));