struct

1、结构体和数组的差别:能够再结构体里声明数组。结构体变量能够相互赋值。而数组不行。

2、struct与class的差别:class的成员訪问权限默认是private,而struct成员的是public。

3、结构体的定义:

(1)可递归。结构体内部能够使用指针指向自己。比如。链表。

(2)可嵌套。结构体内部能够包括其它的结构体。

4、结构体中的位域。

在存储信息时,不须要占用一个完整的字节,而仅仅须要占几个或一个二进制位。

位域定义与结构定义相仿。其形式为:

struct 位域结构名

{

类型说明符 位域名:位域长度

};

比如:

struct bs
{
int a:8;
int b:2;
int c:6;
}data;

分析:data为bs变量,共占两个字节。

当中位域a占8位,位域b占2位,位域c占6位。

对于位域的定义尚有下面几点说明:

1. 因为位域不同意跨两个字节,因此位域的长度不能大于一个字节的长度。也就是说不能超过8位二进位。如一个字节所剩空间不够存放还有一位域时。应从下一单元起存放该位域。

也能够有意使某位域从下一单元開始。

2. 位域能够无位域名。这时它仅仅用来作填充或调整位置。无名的位域是不能使用的。

比如:

struct bs

{

unsigned a:4

unsigned :0 /*空域*/

unsigned b:4 /*从下一单元開始存放*/

unsigned c:4

}

在这个位域定义中,a占第一字节的4位。后4位填0表示不使用。b从第二字节開始。占用4位。c占用4位。

union

结构体和共用体都是由多个不同类型的数据类型成员组成。可是在任一时刻,共用体中仅仅存放了一个被选中的成员。而结构体

中全部成员都纯在。

对于共用体的不同成员赋值,将会对其它成员重写。原来成员的值就不存在了。

(1)结构体占用内存,可能超过各个成员内存量的和,而共用体占用的内存为各个成员中占用最大者内存。

(2)union和struct在内存中的存放顺序是从地地址開始存放的。

大端存储:数据的高字节存放在低地址中。

小端存储:数据的低字节存放在低地址中。

enum

(1)定义

enum   枚举类型名
  {
                 枚举表
  }

比如:

enum ColorEnum1
  {

  红色, //注意,系统会默认给它赋值为0

  蓝色, //系统赋值为1

  黑色, //系统赋值为2

  粉红色 //系统赋值为3

  }

enum ColorEnum2
  {

  红色=1, //用户自己赋值 所以枚举是一组 符号名称/值 配对

  蓝色, // 系统赋值为2

  黑色=1, //用户自己赋值1

  粉红色 //系统赋值为2

  }

所以能够看出。系统会自己给没有赋值的常量赋值。但赋值的方式是依照上一个的值+1来进行操作的

sizeof(struct/union/enum)

一般32位机子上各个数据类型所占的存储空间例如以下:

char:8位

short:16位

int:32位

long:32位

float:32位

double:64位

一、struct,结构体。

请牢记下面3条原则:(在没有#pragma pack宏的情况下)

1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每一个数据成员存储的起始位置要从该成员大小的整数倍開始(比方int在32位机子上为4字节,所以要从4的整数倍地址開始存储)。

2、结构体作为成员:假设一个结构体里同一时候包括结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址開始存储

(如struct a里有struct b,b里有char,int ,double等元素。那么b应该从8(即double类型的大小)的整数倍開始存储)。

3、结构体的总大小:即sizeof的结果。

在按对齐原则计算出来的大小的基础上。必须还得是其内部最大成员的整数倍.

不足的要补齐(如struct里最大为double,如今计算得到的已经是11,则总大小为16)。

样例:

typedef struct bb
{int id;             //[0]....[3]      表示4字节double weight;      //[8].....[15]      原则1float height;      //[16]..[19],总长要为8的整数倍,仅对齐之后总长为[0]~[19]为20,补齐[20]...[23]     原则3
}BB;
typedef struct aa
{   int  id;         //[0]...[3]          原则1  double score;     //[8]....[15]      short grade;    //[16],[17]          BB b;             //[24]......[47]       原则2(由于BB内部最大成员为double,即8的整数倍開始存储)  char name[2]; //[48][49]
}AA;
int main()
{cout<<sizeof(AA)<<" "<<sizeof(BB)<<endl;return 0;
}

输出结果为56 24

编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。

//n为1、2、4、8、16...

1、n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、假设n大于等于该变量所占用的字节数。那么偏移量必须满足默 认的对齐方式,即该变量所占用字节数的整数倍;第二、假设n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

2、结构体的总大小也有个约束条件,分以下两种情况:假设n大于全部成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。

所以在上面的代码前加一句#pragma pack(1),则代码输出为

bb:(0~3)+(4~11)+(12~15)=16;

aa:(0~1)+(2~5)+(6~13)+(14~15)+(16~31)=32,也就是说,#pragma pack(1)就是没有对齐规则。

再考虑#pragma pack(4),

bb:(0~3)+(4~11)+(12~15)=16;

aa:(0~1)+(4~7)+(8~15)+(16~17)+(20~35)=36

二、union共用体(联合)

在union中,全部的共用体成员共用一个空间。而且同一时间仅仅能储存当中一个成员变量的值。其长度为联合体中元类型最大的变量长度的整数倍。

而且要考虑其它成员变量的对齐

union foo
{
char s[10];
int i;
}

sizeof(foo) 的内存空间的长度为12,而并非数组的长度10。考虑对齐。必需要是4(int的大小)的整数倍。

若把int改为double,则foo的内存空间为16,是double型的两倍。

union   mm{  char   a;//元长度1        1int   b[5];//元长度4     20double   c;//元长度8     8int   d[3];              12};

考虑到8和12的对齐,所以sizeof(mm)=24。

三、enum

enum仅仅是定义了一个常量集合,里面没有元素。把它当做int型存储,所以sizeof的大小为4 byte。

【大小端】

推断大小端的方法:1、利用指针。2、利用union。

#include <stdlib.h>
#include <stdio.h>int main()
{int x = 0x10000001;char *p = (char *)&x;if (*p){printf("little\n");printf("%d\n", *p);}else{printf("large\n");}system("pause");return 0;
}
#include "stdio.h"
#include<stdlib.h>int main()
{union w{int a;  //4 byteschar b; //1 byte} c;c.a = 1;if (c.b == 1)printf("It is Little_endian!\n");elseprintf("It is Big_endian!\n");system("pause");return 1;
}

以下这段代码输出也耐人寻味。

#include<stdio.h>
#include<stdlib.h>union {char i[4];short x;
}s;int main()
{s.x = 0;s.i[0] = 256;s.i[1] = 255;s.i[2] = 254;s.i[3] = 253;printf("s.x is %d \n", s.x);printf("s.i[0] is %d \n", s.i[0]);printf("s.i[1] is %d \n", s.i[1]);printf("s.i[2] is %d \n", s.i[2]);printf("s.i[3] is %d \n", s.i[3]);system("pause");
}



转载于:https://www.cnblogs.com/cxchanpin/p/6735078.html

struct、union、enum and sizeof相关推荐

  1. C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示

    C++ 学习笔记(19)new/delete表达式.定位new.typeid.dynamic_cast.type_info.枚举类型.成员函数指针.union.位域.volatile限定符.链接指示 ...

  2. Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  3. 图解SQL inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚.Codi ...

  4. enum、union、namespace定义时没有名字的含义

    1   .enum { size=100}  就相当于 #define size 100  size是有作用域的 如 int main() { int i=10; { enum{ a=10,b=11} ...

  5. postgre——case、union、小计总计(GROUP BY ROLLUP)写法

    //将几张不同表结构的数据全部合并在一起,使用了case.union,同时实现小计总计 //小计总计使用的 GROUP BY ROLLUP函数,GROUP BY ROLLUP使用双括号将字段括起来,是 ...

  6. 汇编语言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )

    1:SCASW : 在wordArray中扫描16位数值0100h,将匹配元素的偏移量复制到EAX .386 .model flat,stdcall.stack 4096 ExitProcess PR ...

  7. struct和union,enum分析

    空结构体占用的内存多大? 1 struct d 2 { 3 4 }; 5 6 int main() 7 8 { 9 10 struct d d1; 11 12 struct d d2; 13 14 p ...

  8. 图解SQL的inner join(join)、left join、right join、full outer join、union、union all的区别...

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  9. 图解SQL的inner join、left join、right join、full outer join、union、union all的区别

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

最新文章

  1. 编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理
  2. Ado.Net 连接数据库
  3. 不用L约束又不会梯度消失的GAN,了解一下?
  4. Windows多网口内外网设置
  5. 【java笔记】类/接口作为成员变量类型
  6. 2020 HDU多校联合训练
  7. WD移动硬盘无法存储,提示空间不够(已解决)——当移动硬盘遇到坚果云
  8. 计算机转魔方最快多少,人类最快还原魔方的极限时间是几秒?
  9. 使用pygame制作Flappy bird小游戏
  10. Axure RP 10怎么卸载干净,Axure RP 10怎么在注册表卸载清除
  11. 超详细!Win10(UEFI启动)安装Ubuntu18.04双系统
  12. 探究腾讯云TCA和阿里acp的区别
  13. python大学生生活信息交互平台的设计与实现毕业设计-附源码031315
  14. linux fw_printenv fw_setenv 设置uboot环境变量
  15. python 判断是否是元音字母
  16. 使用思博伦Avalanche进行HTTP双向吞吐量测试 _双极未来
  17. vs2010 添加向前导航/向后导航按钮
  18. VS增加插件 Supercharger破解教程
  19. delphi 裁剪mp3_delphi版MP3切割
  20. share.js使用注意事项

热门文章

  1. 前端新手入门必读!前端开发线路图分享
  2. python安装方法_【Python教程】Windows10 安装Python
  3. java类初始化_Java的类/实例初始化过程
  4. php表单的提交方法有什么,php – 确定哪个表单已提交的最佳方法是什么?
  5. Java中GUI中菜单栏
  6. deeplearning中卷积后尺寸的变化
  7. 目标检测中的正负样本
  8. Pytorch:比较函数
  9. (五)Qt实现自定义模型基于QAbstractItemModel
  10. Can't create handler inside thread that has not called Looper.prepare()