1:简单理解,结构体就是数组的进一步发展,数据的优点和缺陷在于数据里面是元素类型必须相同,但是结构体没有这个要求,结构体里面元素的类型可以相同也可以不同。

2:结构体的定义:

struct student
{int age;char name[20];
}s1;

上面这种方法是结构体定义的同时定义变量,结构体的定义有两部分组成

struct studen:结构体的类型

s1:类型为struct student的结构体变量,当然还可以用struct studet s2;l来定义变量s2

注意结构体里面的元素不能再创建的时候直接赋值,而是要通过外部访问来对结构体进行填充

3:结构体里面变量的访问

结构体里面的元素访问方式有两种,一种是  .    一种是->,但其实质上都是通过指针来访问的。

C语言规定用结构体的变量来访问结构体的时候是用  .  用结构体变量的指针来访问结构体的时候用->

4:结构体的对齐访问

首先要知道一点,我们使用 . 的方式来访问结构体时是不同考虑结构体内存对齐问题的,这部分编译器会帮我们处理,但是如果我们想通过指针方式来访问结构体里面的各元素的时候就需要考虑内存对齐的问题。结构体内存对齐访问一个主要原因是硬件本身的物理限制,使用对齐访问可以提高访问的效率。但是内存对齐也会带来内存空间浪费的问题,所以内存对齐访问实际上是通过牺牲内存空间来换取的速度。

5:结构体对齐的规则和运算

编译器本身可以设置内存对齐的规则,但是一下几点规则需要记住

(1)32位编译器,一般米、默认是4字节对齐

(2)结构体整体本身必须安置在4字节对齐处,也就是结构体的首地址必须是4整数的倍数(如果编译设置为n字节对齐访问,则首地址就是n的整数倍(n = 1 2 4 8 16 ...))

(3)结构体中每个元素本身必须对齐存放

(4)整个结构体的所占的内存空间必须是4的整数倍(同样如果是n字节对齐就是n的整数倍)

struct mystruct1
{                        //1字节对齐        //4字节对齐
int a;           // 4                  //   4
char b;          //1                      //   2short c;         //2                 //   2
}mystr1; struct mystruct2
{                  //1字节对齐        //4字节对齐
char a;           // 1            //   4  (1+3)3字节填充
int    b;          //4                //   4short c;          //2             //   4  (2 +2)2字节填充
}mystr2;

分析:

首先是整个结构体,整个结构体变量4字节对齐是由编译器保证的,然后再是第一个元素a,a的开始抵制就是整个结构体的开始地址,所以自然就是4字节对齐的,但是的结束地址此时是不确定的,得由下一个元素决定;

第二个元素b,因为上一个元素a本身占4字节,其本身就是对齐的,所以留给b的开始地址也是4字节对齐,所以b就可直接存放(b存放的开始位置就决定a要占多少个字节,这里因为元素a字节刚好满足4字节对齐,不需要进行填充,所以这里a就占4字节),b的起始地址决定后,结束地址的确定需要依赖于下一个元素,原因是可能要进行填充,并且下一个元素的类型不通,则需要填充的字节数也是不同的;

转载于:https://blog.51cto.com/11674570/1861684

C语言之结构体以及结构体对齐访问相关推荐

  1. c 结构体 不允许使用不完整的类型_C语言必学知识点 quot;结构体quot;详细解析!...

    结构体是经常用到的数据类型,使用频率不亚于指针,所以需要重视,不过用法非常简单. 一.什么是结构体 ☀ 在前面的时候已经介绍了C语言中的数组,用法跟其他语言差不多.当一个整体由多个数据构成时,我们可以 ...

  2. C语言 匿名联合体和匿名结构体

    C语言 匿名联合体和匿名结构体 匿名联合体和匿名结构体顾名思义,就是没有名字的联合体和结构体,没有名字哪怎么用?拿来用? 在嵌入式数据通信里面,大部分都是使用联合体,将有实际意义的结构体和字节数组互相 ...

  3. C语言结构体和结构体数组示例 - Win32窗口程序演示

    C语言结构体和结构体数组的使用: /* C结构体和结构体数组示例,by bobo */#include <windows.h>LRESULT CALLBACK WndProc (HWND, ...

  4. C语言中函数如何返回结构体?

    //#include "stdafx.h"//If the vc++6.0, with this line. #include "stdio.h" #inclu ...

  5. 遍历结构体_三菱ST语言编程(3)——结构体变量

    上篇文章介绍了数组,是一组相同类型数据的列表,那么不同类型的数据能否组合到一起用一个标签表示呢?答案当然是可以的,而实现这个功能的就是结构体(struct). 建立结构体 在三菱结构化编程的界面中左侧 ...

  6. C语言之结构体和共用体

    C语言之结构体和共用体 算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注.本人也算 ...

  7. C语言中的结构体,结构体中数组初始化与赋值

    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,具体的对齐方式这里 暂不讨论: 1.结构体的 ...

  8. C语言学生信息管理系统(结构体数组,文件)

    C语言学生信息管理系统(结构体数组,文件) 这是初学时写的一个程序,比较菜,不喜勿喷.在一个结构体里定义结构体内所有的信息(如果信息也需要分类则可以再定义一个结构体并在当前结构体内声明,我的这个代码在 ...

  9. 【C语言】结构体、共用体、位域

    结构体 1. 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. }; 这是其中一种声明方式~ 2.定义一个结构体变 ...

最新文章

  1. ccs怎么把2个变量都在一个graph中显示_因果推理实战(2)——利用Tetrad进行因果分析...
  2. nginx配合modsecurity实现WAF功能
  3. 统计学怎么求加权指数_我要自学生信之统计学:统计学概述(一)
  4. ActiveRecord多表查询
  5. [Oracle整理]CASE-END
  6. Win2003 IIS下,ASP.NET无法访问数据库和网页
  7. C++|Java混合实验-java搭建post方法靶场,Qt发送请求获取数据
  8. 关于mysql的几个问题
  9. 中国联通回应5G入网问题:尚未对公众客户开放
  10. 在Web应用程序中执行常见搜索场景的服务器端方法
  11. [HDOJ2512]一卡通大冒险(DP)
  12. centos安装mysql wsl_windows 10 WSL 安装 Centos
  13. 网站smtp服务器,SMTP服务器
  14. 读透《华为数据之道》
  15. LoadRunner教程(18)-LoadRunner 图表合并
  16. 51单片机外部中断使用示例程序
  17. 计算机软件工程专业大学排名专科,2020软件工程专业大学排名一览表
  18. 华为移动应用引擎安装第三方apk教程
  19. 【榜单】机器学习 深度学习近三年被引最多论文 Top 20,图像识别 GAN等(附下载)
  20. 阈值、阙值 有没有阀值?

热门文章

  1. Rust 每天一库系列 Ftp 库
  2. 22.25在计算机中如何储存,浮点数在计算机中存储方式
  3. linux界面设计论文,毕业设计(论文)-基于linux的云校园桌面虚拟化系统的设计与实现.doc...
  4. Matlab学习笔记——数据文件定位
  5. RabbitMQ学习总结(2)——安装、配置与监控
  6. Decision Tree
  7. oracle完全删除实例
  8. 记一些css 3效果
  9. Spring和Spring MVC包扫描
  10. 每天一个前端名词——Babel