结构体<C语言>

打印 上一主题 下一主题

主题 666|帖子 666|积分 1998

导言

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

目次
导言
结构体的创建
结构体变量的声明
结构体成员的初始化、访问
结构体的内存对齐



结构体的创建

  1. struct stu {//比如描述一个学生
  2.         char name[10];//名字
  3.         int age;//年龄
  4.         int score;// 得分
  5. };
复制代码
结构体变量的声明

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

关于typedef重命名结构体,也可先创建结构体,再重命名:
  1. struct stu{
  2.         char name[10];//名字
  3.         int age;//年龄
  4.         int score;// 得分
  5. };
  6. typedef struct  stu stu;
  7. stu stu1, stu2;
复制代码
结构体的特别声明:匿名结构体:

结构体成员的初始化、访问

初始化:

按顺序初始化:
  1. struct stu {//比如描述一个学生
  2.         char name[10];//名字
  3.         int age;//年龄
  4.         int score;// 得分
  5. };
  6. int main() {
  7.         struct stu stu1 = { "mariiy",18,89 };//按顺序初始化
  8.         return 0;
  9. }
复制代码
不按顺序初始化:
格式:.成员名=初始值
  1. struct stu {//比如描述一个学生
  2.         char name[10];//名字
  3.         int age;//年龄
  4.         int score;// 得分
  5. };
  6. int main() {
  7.         struct stu stu1 = { .age=19,.name="joke",.score=90};//不按顺序初始化
  8.         return 0;
  9. }
复制代码

访问:

直接使用变量名(操作符“.”)
格式:变量名.成员名


使用指针(操作符“->”)
格式:结构体指针->成员名


结构体的内存对齐


结构体的内存对齐描述了结构体成员在内存中的存储位置,是决定结构体内存巨细的重要因素。
由于结构体内存对齐的因素存在,两个存储着同等数目、范例的结构体,会由于成员在结构体内部顺序的不同,导致占用内存巨细的不同。
如:

 这时结构体巨细为16字节。

我们变动一下顺序(将score移到第二位)

  这时结构体巨细为20字节。

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

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

以是我们可以分析在上面的两个结构体中内存结构:

内存结构:
 


 

 内存结构:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表