位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是int, unsigned int或signed int
2.位段的成员后边有一个冒号和1个数字
如:struct A
{
int - a : 2;//意思是只需要2个比特位
int - b : 5;
}
3.只能在结构体中使用
内存分配(位段)
1.位段空间上是按照需要以4个字节(int)或1个字节(char)的方式来开辟的。
2.位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。
如:
#include <stdio.h>
struct A
{
//4byte - 32bit
int a : 2;
int b : 5;
int c : 10;
//15
//4byte - 32bit
};
int main()
{
printf("%d\n", sizeof(struct A));
return 0;
}
位段跨平台问题:
1.int位段被当成有符号数还是无符号数是不确定的。
2.位段中最大位的数目是不能确定。(16位机器最大16,32位机器最大32,写成27会在16位机器中出问题)
3.位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
4.当一个结构包含两个位段,第二个位段成员比较大,无法容纳第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。
总结:跟结构相比,位段可以达到同样的效果,但可以很好节省空间,但有跨平台问题存在。
枚举的优点
为什么使用枚举?
我们可以使用#define定义常量,为什么非要用枚举?
枚举的优点:
1.增加代码的可读性和可维护性。
3.和#define定义的标识符比较枚举有类型检查,更加严谨。
3.防止命名污染。
4.便于调试。
5。使用方便,一次可以定义多个变量。
联合:联合也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间,所以联合体也叫共用体。
举例:
union un
{
int a;
char c;
};
int main()
{
union un;
printf("%p\n", &(u.a));
}
判断当前计算机的大小端存储:
#include <stdio.h>
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
//int a = 1;
//低到高
//01000000..小端
//00000001....大端
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
printf("大端\n");
return 0;
}
原理:
union un
{
char arr[5];
int i;
}
指针,结构体,动态内存开辟学号此三类知识时用c/c++写好数据结构的基础