1、共用体
自定义数据类型:结构体和共用体
结构体:
struct A
{
int a;
float b;
};//8字节
共用体(联合体):
union B//联合体,共用体
{
int a;
float b;
};
特点:
所有的成员共用内存,也就意味着所有成员都是从相同的低地址开始;
在同一个共用体变量中,只能使用一个成员;
代码示例:
union B//联合体,共用体
{
int a;
float b;
};//4字节
int main()
{
union B ua;
ua.a = 10;
printf("%d\n",ua.a);
ua.b = 12.5;
printf("%d\n",ua.a);
return 0;
}
运行结果:
特性利用:判断当前平台是否为小端(常考)
小端:低地址保存小数据,例如short a = 0x0001,如果低地址保存的是0x01则为小端;
代码:
bool IsLittle()
{
union
{
char a;
short b;
}ua;
ua.a = 0x0001;
return ua.a == 0x01;
}
int main()
{
if(IsLittle())//PC是小端
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
运行结果:
2、位段(位域)
struct C//位段
{
int a:8;//说明a占8位
int b:20;
int c:4;
};//4个字节
struct D
{
int a:10;
int b 30;
};//8个字节
历史遗留问题,现在不再使用;
因为标准没用规定,位段内部数据的存放方式不同平台不一样,不可移植;
只需要知道其占用的字节数(一定是整型的 倍数);
3、typedef:类型定义
C语言不允许函数名重载(函数名必须唯一),C++可以
测试代码:
struct Student
{
char name[20];
int age;
};
int main()
{
//struct Studnet stu1 = {"caocao",20};
//printf("%s,%d\n",stu1.name,stu1.age);
Studnet stu2 = {"caocao",20};
printf("%s,%d\n",stu2.name,stu2.age);
return 0;
}
c语言环境–报错:
C++环境–通过:
typedef应用
1)起个简短的别名;
2)根据数据特征起别名;
例如:size_t
使用:
typedef 类型名 新的类型名称;
例子1:
typedef unsigned long long int uint64; //给unsigned long long int 起一个别名叫 uint64
uint64 ---- 64 的意思是 8*8 ,指的是这个类型为8个字节
例子2:
typedef int * Pint;//Pint == int * 是定义类型
#define PINT int* //是字符替换
重点使用(经常使用):
struct Student
{
char name[20];
int age;
};
typedef struct Student Studnet;
等价于
typedef struct Student
{
char name[20];
int age;
}Studnet;
注意:
老版C语言有个要求,变量要定义在最前面,否则会报错:
C++则是在使用前定义就行;
例如代码:
运行结果:
错误修改(在前面加 ‘;’):
运行结果(依旧报错):
正确修改(只需将变量名改到前面):
运行结果(问题解决):