C++笔记---结构体、共用体、枚举

一、结构体
1、结构体和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型,其次,相同结构的结构体变量时可以相互赋值的,而数组时做不到的。

2、C++中的结构体与类的区别:
(1)class中默认的成员访问权限是private的,而struct中则是public的。
(2)class继承默认是private继承,而从struct继承默认是public继承。

3、结构体类型变量的定义一般形式为:
struct 结构体类型名{
类型名1 成员名1;
类型名2 成员名2;
类型名n 成员名n;
};
其中struct是结构体类型的标志。结构体名是用户定义的标识符。

4、定义结构体类型,只说明该类型的组成情况,并没有分配内存空间。只有当定义属于结构体类型的变量时,系统才会分配空间给该变量。

5、在结构体类型定义中要注意以下几点:
1)结构体类型定义中不允许对结构体本身的递归定义。但可以使用指针指向本类型。
struct person{
类型名1 成员名1;
类型名2 成员名2;
struct person *per;//指向本类型的指针
};
2)结构体定义中可以包含另外的结构体,即结构体是可以嵌套的。
3)结构体变量可以在定义时进行初始化赋值。
struct person{
char name[20];
char sex;
}boy1={“zhangbing”,’M’};
在对结构体变量初始化时,应将各成员所赋初值依照结构体类型说明中成员的顺序依次放在一对大括号中,不允许跳过前面的成员给后面的成员赋值,但可以只给前面若干成员赋初值,后面未赋初值的成员中,数值型和字符型的数据,系统自动赋值零。

6、有些信息在存储时并不需要占用一个完整的字节,而只需占几个或一个二进制位,C++提供了一种数据结构,称为“位域”或“位段”

7、C与C++允许指定占用特定位数的结构成员。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数,且可以使用没有名称的字段来提供间距。每个成员都被称为位字段。
struct reg{
unsigned int SN:4;
unsigned int :4;
bool good:4;
};
reg r = {14,true};
使用位域可以达到压缩数据的目的。
位域的使用和结构体成员的使用相同。

二、共用体union
1、结构体和共用体(联合)都是由多个不同的数据类型成员组成,但在任何同一时刻,共用体中只存放了一个被选中的成员,而结构体中的所有成员都存在。对于共用体的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构体的不同成员赋值是互不影响的。

2、参考形式:
union 共用体名{
数据类型 成员名;

数据类型 成员名;

}变量名;
共用体的用途之一是当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。

3、共用体union的存放顺序是所有成员都从低地址开始存放(结构体所有成员也都是从低地址开始存放)。
大端存储格式即字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。
小端方式和大端方式的区别是字中的字节的存储顺序不同,而字与字之间的存储顺序是相同的。(X86是小端,SPARC是大端)

4、判断大小端:

define BIG_ENDIAN 0

define LITTLE_ENDIAN 1

int TestByteOrder(){
short int word=0x0001;
char byte = (char ) &word;
return (byte[0]  ? LITTLE_ENDIAN : BIG_ENDIAN);

5、printf函数是最右侧的元素先入栈,若入栈元素为char、short等小于4个字节的类型,入栈时也占4个字节;大于4个字节时,按实际字节入栈;字符串参数入栈的是指向字符串的指针。当数是无符号类型时,高位总是补1,当数是有符号类型时,高位补符号位。

6、大端小端还会影响到位域成员的存放。
定义的数据结构中包含bit位域,将以以下规则存放:
1)低字节都存放在低地址;
2)大端模式首先为字段的高bit位分配空间,小端模式首先为字段的低bit位分配空间;
3)大端模式首先存放地址的高bit位,小端模式首先存放地址的低bit位。

三、枚举enum
1、enum提供了另一种创建符号常量的方式,这种方式可以代替const。使用enum的句法与使用结构相似。

2、枚举是一种用户自定义的类型,定义的基本格式为:
enum 枚举类型名 {枚举常量 1 [=整型常数], 枚举常量 2 [=整型常数],….} [变量名列表]
花括号中的内容成为枚举表,其中的每一项称为枚举常量,枚举表中每项后的“=整型常数”是给枚举常量赋初值,用方括号代表这步可以省略,如果不给枚举常量赋初值,编译器会为每一个枚举常量赋一个不同的整型值,第一个为0,第二个为1等。当枚举表中某个常量赋值后,其后的成员则按依次加1的规则确定其值。

3、枚举值是常量不是变量,不能在程序中再为枚举元素赋值。

4、枚举型可以隐式的转换为int型,int型不能隐式的转换为枚举型。

猜你喜欢

转载自blog.csdn.net/qq_38224589/article/details/81587168
今日推荐