c语言可以定义枚举类型,其关键字为,c语言枚举例题
我将为假期做笔记。
这个月可能会发表十几二十篇。
这个目录中位段的内存分配是怎样的?位段枚举的跨平台问题枚举使用联合类型的定义、联合的特征、联合大小的计算练习
段段是通过结构实现的。(也会有对齐之类的)
(位段以位为单位)
什么是位段?位段的声明和结构是相似的,但有两点不同:
该位的成员必须是char、int、unsigned int或signed int。
该位的成员名称后跟一个冒号和一个数字。
诸如
结构A
{
int _ a:2;
int _ b:5;
int _ c:10;
int _ d:30;
};//8int是打开空间4的字节数
之后变量占用的位数:
第一个空间够了,下一个就不开第二个空间了。
比如这个题目只开辟了两个int的空间,占了8个字节。
位的内存分配。位段的成员可以是int无符号int有符号int或char(属于整形家族)。一个位段的空间根据需要开4字节(int)或1字节(char)。双边投资条约涉及许多不确定因素。位不是跨平台的,所以可移植的程序应该避免使用位。例子
(由于位段的不确定性,我们演示VS2019的版本):
//一个例子
结构S
{
char a:3;
char b:4;
char c:5;
char d:4;
};
int main()
{
结构S={ 0 };
s.a=10
s.b=12
s . c=3;
标准差=4;
返回0;
}
位的跨平台问题不确定int位是视为有符号数还是无符号数。无法确定一个段中的最大位数。(16位机最大16,32位机最大32,写成27。16位机会有问题。一个段的成员在内存中是从左到右分配还是从右到左分配还没有定义。当一个结构包含两个段,并且第二个段成员太大而无法容纳第一个段的剩余位时,是丢弃剩余位还是使用它们是不确定的。不确定段可以节省空间,但跨平台能力差。我们在使用段位的时候,首先要遵守自己平台段位的规则。
每个信息的比特控制大大提高了空间的利用率。
枚举#枚举
枚举与#define相似,都是把字母变成常量,但是枚举比#define有优势。
与#define定义的标识符相比,用枚举类型检查增加代码的可读性和可维护性更加严谨。为了防止命名污染(封装)并方便调试和使用,可以一次定义多个常量。
枚举使用枚举颜色//color。
{
红色=1,
绿色=2,
蓝色=4
};
int main()
{
枚举颜色clr=绿色;//只能用枚举常量给枚举变量赋值,这样就不会有类型差异。
clr=5;
返回0;
}这段代码在C编译器中可以正常使用,但是在cpp编译器中会报错。
当我们不初始化枚举类型中的元素时,我们会在递增的情况下自动赋值,从0开始。
下面显示了枚举的不同赋值情况:
不赋值:那么RED=0 GREEN=1 BLUE=2给RED赋值,比如当RED=1: RED=1 GREEN=2 …只给GREEN赋值,比如GREEN=2:RED=0 GREEN=2 BLUE=3。
我们枚举中的元素是不变的,不能改变。
工会#工会
union类型的定义Union也是一种特殊的自定义类型。
该类型定义的变量还包含一系列成员,其特点是这些成员共享同一个空间(所以并集也称为共享体)。
可以观察到它们的地址是相同的。
联合国联盟
{
char c;
int I;
};
//联合变量的定义
int main()
{
union Un联合国;
//计算偶数变量的大小
printf(%d\n ,sizeof(un));//4
返回0;
}
工会的特点
联合的成员共享相同的内存空间,因此这种联合变量的大小至少是最大成员的大小(因为联合必须至少能够容纳最大成员)。
财团规模的计算财团的规模至少是最大成员的规模。当最大成员大小不是最大对齐数的整数倍时,它应该对齐到最大对齐数的整数倍。例如
union Un1
{
char c[5];
int I;
};//大小是8
union Un2
{
短c[7];
int I;
};//尺寸是16。因为char a[5]属于char类型,所以它的对齐号是1,而int类型的对齐号是4。
最初,他们共享同一个大小为5的空间。
但是,联合体的大小应与最大对齐数的整数倍和4、8的整数倍对齐。
第二个原因是一样的
short类型的对齐方式为2,int类型的对齐方式为4。
最初,常见的内存大小是14(7*2)。
但是,要对齐到最大对齐数的整数倍,而4的整数倍大于14,所以是16。
练习第一个问题
int main()
{
无符号字符puc[4];
结构标记
{
无符号字符ucPim1
无符号字符UC data 0:1;
无符号字符UC data 1:2;
无符号字符UC data 2:3;
} * pstPimData
pstPimData=(struct tag PIM *)puc;
memset(puc,0,4);
pstPimData-UC PIM 1=2;
pstPimData-UC data 0=3;
pstPimData-UC data 1=4;
pstPimData-UC data 2=5;
printf(x x x x\n,puc[0],puc[1],puc[2],puc[3]);
返回0;
}//02 29 00 00注意是%x格式打印中的第二个问题。
#包含stdio.h
int main()
{
联盟
{
短k;
char I[2];
}*s,a;
s=a;
s-I[0]=0x 39;
s-I[1]=0x 38;
printf("%x\n ",a . k);
返回0;
}//3839
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。