惊雷无声 发表于 2024-6-13 21:55:43

结构体<C语言>

导言

结构体是C语言中的一种自界说范例,它的值(成员变量)可以是多个,且这些值可以为不同范例,这也是和数组的重要区别,下面将先容它的一些根本用法,包罗:结构体的创建、结构体变量的声明、初始化、结构体的访问、结构体的内存对齐等。
目次
导言
结构体的创建
结构体变量的声明
结构体成员的初始化、访问
结构体的内存对齐


结构体的创建

struct stu {//比如描述一个学生
        char name;//名字
        int age;//年龄
        int score;// 得分
}; 结构体变量的声明

常用的有以下3种:
1.在结构体创建时同时声明结构体变量:
struct stu {//比如描述一个学生
        char name;//名字
        int age;//年龄
        int score;// 得分
}stu1,stu2;//声明了stu1和stu2 2.先创建结构体,后声明(包罗在函数内部声明):
//2.先创建结构体,后初始化:
struct stu {//比如描述一个学生
        char name;//名字
        int age;//年龄
        int score;// 得分
};
struct stu stu1, stu2; 3.使用typedef先重命名,再声明:
//3.使用typedef先重命名,再声明:
typedef struct stu {//比如描述一个学生
        char name;//名字
        int age;//年龄
        int score;// 得分
}stu;//当前面使用typedef时,分号前不再是变量声明,而是重命名后的类型

stu stu1, stu2;//声明了stu1和stu2
关于typedef重命名结构体,也可先创建结构体,再重命名:
struct stu{
        char name;//名字
        int age;//年龄
        int score;// 得分
};

typedef structstu stu;

stu stu1, stu2; 结构体的特别声明:匿名结构体:
https://img-blog.csdnimg.cn/direct/3f55c2987b114e1087cc2937de72b41c.png
结构体成员的初始化、访问

初始化:

按顺序初始化:
struct stu {//比如描述一个学生
        char name;//名字
        int age;//年龄
        int score;// 得分
};

int main() {
        struct stu stu1 = { "mariiy",18,89 };//按顺序初始化
        return 0;
} 不按顺序初始化:
格式:.成员名=初始值
struct stu {//比如描述一个学生
        char name;//名字
        int age;//年龄
        int score;// 得分
};

int main() {
        struct stu stu1 = { .age=19,.name="joke",.score=90};//不按顺序初始化
        return 0;
}
访问:

直接使用变量名(操作符“.”)
格式:变量名.成员名
https://img-blog.csdnimg.cn/direct/af5e255b588548358902465ab5425dc9.png

使用指针(操作符“->”)
格式:结构体指针->成员名
https://img-blog.csdnimg.cn/direct/cc94d34997074a77bf3232834af2b569.png
结构体的内存对齐


结构体的内存对齐描述了结构体成员在内存中的存储位置,是决定结构体内存巨细的重要因素。
由于结构体内存对齐的因素存在,两个存储着同等数目、范例的结构体,会由于成员在结构体内部顺序的不同,导致占用内存巨细的不同。
如:
https://img-blog.csdnimg.cn/direct/ae7f0f641ad34a2e9ee1ae68aab885af.png
 这时结构体巨细为16字节。

我们变动一下顺序(将score移到第二位)
https://img-blog.csdnimg.cn/direct/f622ae79b05a4c82b3a7c3318b98b996.png
  这时结构体巨细为20字节。

两个结构体内的成员范例、个数完全一样,只是声明顺序不一样,导致结构体巨细不一样。

对齐规则:
●结构体的第一个成员对齐到偏移量为0结构体变量的起始地址处。
●其他成员要对齐到对齐数的整数倍数处(偏移量的整数倍)
        对齐数:编译器默认的对齐数与成员范例巨细的较小值(数组范例巨细为成员范例巨细)
        —vs上默认对齐数是8
        —Linux没有默认对齐数,对齐数就是成员范例巨细
●结构体的总巨细为最大对齐数(全部成员的对齐数中最大的那个)的最小整数倍
●如果嵌套了结构体,结构体成员会对起到它的最大对齐数(不会再与编译器的默认对齐数比较)的整数倍数处

以是我们可以分析在上面的两个结构体中内存结构:
https://img-blog.csdnimg.cn/direct/ae7f0f641ad34a2e9ee1ae68aab885af.png
内存结构:
 https://img-blog.csdnimg.cn/direct/8819bc3a8d634e289223e7d83af677f2.png

 https://img-blog.csdnimg.cn/direct/f622ae79b05a4c82b3a7c3318b98b996.png
 内存结构:
https://img-blog.csdnimg.cn/direct/03a620d824484426a82f44d99e7d1c60.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 结构体<C语言>