1.结构体struct
结构体与数组的不同:
1)结构体可以在一个结构中声明不同的类型,数组做不到
2)相同结构的结构体是可以相互赋值的,数组做不到
C++的class与struct的区别:
Class的成员访问权限默认为private,而struct的成员访问权限默认为public
结构体的定义
结构体类型变量的定义一般形式为:
Struct 结构体类型名
{
结构体1 成员名1;
结构体2 成员名2;
...
结构体n 成员名n;
};
在结构体定义时要注意以下几点:
1)结构体结构体类型定义中不允许对结构体本身递归定义,但可以使用指针指向本结构体。
2)结构体定义中可以包含另外的结构体,即结构体是可以嵌套的。
3)结构体变量可以在定义时进行初始化赋值。
结构体中的位字段 略
2. 共用体 union
结构体和公用体(联合)都是由多个不同的数据成员组成,但在任何同一时刻,共用体中只存放了一个被选中的成员,而结构体的所有成员都存在,对公用体的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构体的不同成员赋值是互不影响的。
其参考形式为:
Union 公用体名
{
数据类型 成员名;
数据类型 成员名;
...
数据类型 成员名
}变量名;
共用体占用内存为各大成员中占用最大者的内存。
3.枚举
枚举是一种用户自定义类型,定义的基本格式为:
Enum 枚举类型名
{
枚举常量1[=整形常数],
枚举常量2[=整形常数],
...
}[变量名列表]
花括号中的内容称为枚举表,其中的每一项称为枚举常量,换言之,枚举表是枚举常量的集合。枚举表中每项后的“=整形常数”是给枚举变量赋初值,用方括号代表这步可以省略,如果不给枚举常量赋初值,编译器会为每一个枚举常量赋一个不同的整数值,第一个为0。当枚举表中某个常量赋初值后,其后的成员则按依次加一的规则确定其值。
4.sizeof运算符
使用方法
1)用于变量
Sizeof的使用形式: sizeof(var_name)或 sizeof var_name
变量名可以不用括号括住,但是带括号的用法更加普遍。
2)用于数据类型
Sizeof的使用形式: sizeof(type)
数据类型必须用括号括住
Sizeof 结果
Sizeof操作符的结果是 size_t ,它被定义为unsigned_int 类型,该类型保证能容纳实现所建立的最大对象的字节大小。
3)与strlen()比较
Sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示,故将内容与’\0’的数组元素计算在内。而strlen计算字符数组的字符数,以’\0’为结束标志,且不讲’\0’计算在字符内。
4)指针、引用、汉字及数组的sizeof 操作
指针可以视为变量的一种,在32位机器系统下,所有指针变量的sizeof 操作结果均为4,若在64位机器系统下,所有指针变量的sizeof 操作结果均为8
所有引用变量的sizeof ,等同于被引用对象的sizeof。
对于C字符串,需要牢记C/C++中一个汉字仅占两个字节,且字符串末尾有一个空字符。
对于数组,sizeof可直接计算数组大小。
5)struct 的空间计算
Struct的空间计算较为复杂,总体上遵循两个原则
第一个原则是:整体空间是占用空间最大的成员(的类型)所占字节数的整数倍,但在32位Linux + gcc 环境下,若最大成员类型所占字节数超过4,则整体空间是4的倍数即可。
第二个原则是:数据对齐原则------内存按结构体成员的先后顺序排列,当排到该成员变量时,其前面已摆放的成员大小必须是该成员类型大小的整数倍,如果不够则补齐,依次向后类推,但在Linux+gcc 环境下,若某成员类型所占的字节数超过4,如double是8,则前面已摆放的空间大小是4 的倍数即可。