c语言19-共用体、位段、typedf

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++则是在使用前定义就行;

例如代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
错误修改(在前面加 ‘;’):

在这里插入图片描述
运行结果(依旧报错):
在这里插入图片描述
正确修改(只需将变量名改到前面):
在这里插入图片描述
运行结果(问题解决):
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值