struct、union、enum和typedef分析

来源:本站
导读:目前正在解读《struct、union、enum和typedef分析》的相关信息,《struct、union、enum和typedef分析》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《struct、union、enum和typedef分析》的详细说明。
简介:C语言知识补充

struct

空结构体大小,依据编译器的不同而不同,gcc中为0,且不同的结构体变量地址相同;而在g++中为1,不同的结构体变量地址也不同。没有谁对谁错,现代编译器中认为空结构体大小为1较为合理。

柔性数组

即数组大小待定的数组。

规则:结构中最后一个元素允许是未知大小的数组;

结构中的柔性数组成员前面必须至少一个其他成员。

typedefstructflex

{

intlen;

intarray[];

}SoftArray;

array[]0个元素没有占用空间,所以sizeof(SoftArray)=4。

分配内存空间操作如下:

SoftArray*sa=(SoftArray*)malloc(sizeof(SoftArray)+10*sizeof(int));

此时sizeof(*sa)仍为4,柔性数组只是编外人员,不占用结构体的编制。只是说在使用柔性数组时需要把它当成结构体的一个成员而已,仅此而已。

union

只分配最大域的空间,所有域共享这个空间

union维护足够的空间来置放多个数据成员的“一种”,而不是为每个数据成员配置空间,在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。

大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

union型数据所占的空间等于其最大的成员所占的空间。对union型的成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始。

unionc

{

inti;;

charc;

};

unionccc;

cc.i=1;

printf("%dn",cc.c);//若为1,则为小端模式;为0,则为大端模式

enum

是一种自定义类型,真真正正的常量

enum默认常量在前一个值的基础上依次加1

enum类型的变量只能取定义时的离散值,只能是int型

enum类型变量只能取值为花括号内的任何一个值

enumcolor

{

GREEN,

RED=2,

BLUE

};

enum变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,它们的值从0开始依次递增1。所以GREEN=0,BLUE=3。

枚举类型和#define区别

#define宏常量只是在预编译阶段简单的进行值替换,枚举常量是在编译的时候确定其值,是真正意义上的常量

#define宏常量无法被调试,枚举常量可以

#define宏常量无类型信息,枚举常量是一种特定类型的常量

typedef

用于给一个已经存在的数据类型重命名

并没有产生新的类型

typedef重定义的类型不能进行unsigned和signed扩展

typedef不能和static等存储类型指示符同时使用,因为每个变量只能有一种存储类型,所以代码:typedefstaticinti;是非法的。

typedef和#define区别

typedef是给已有类型取别名

#define为简单的字符串替换,无别名概念

typedefchar*PCHAR;

PCHARp1,p2;-->char*p1;char*p2;

#definePCHARchar*

PCHARp1,p2;-->char*p1,p2;-->char*p1;charp2;

提醒:《struct、union、enum和typedef分析》最后刷新时间 2024-03-14 01:06:28,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《struct、union、enum和typedef分析》该内容的真实性请自行鉴别。