day 16 C语言核心:共用体、枚举与位运算详解
一、共用体
共用体的概念:有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中(见图11-24)。以上3个变量在内存中占的字节数不同,但都从同一地址开始。
关键字: union(struct使用方法类似)
stepl定义一个类型---共用体类型
step2定义变量,数组,指针
union demo
{
int a;
short b;
char c;
};//共用体类型
1.共用体的空间大小 == 等于最大的成员的大小,默认对齐。
2.共用体初始化默认是给到第一个成员的------按第一个成员的方式进行初始化
3.各个成员的起始位置一样根据各个成员的类型大小,拿到的字节数(空间大小)是不一样的
4.如果对共用体多次赋值每个成员,只能影响到自己对应的空间,最终赋值的结果是多次赋值后的 综合结果。
5.通过union本身特点实现大小端判断?
int isLIttleEndian(void)
{
union demo
{
int a;
char b;
}d = {1};
return d.b;
}
6.用途:a.节省空间 b.协议很多字段,都是用共用体来实现空间的公用 c.实现数据转换
二、枚举类型的基本概念
枚举(Enumeration)如果一个变量只有几种可能的值,则可以定义为枚举类型。所谓“枚举”是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内,通过enum关键字定义,可以提高代码的可读性和可维护性。用宏定义,通过将一些常量表示为符号。
enum 枚举名
{ 枚举元素1, 枚举元素2, ...
};
注意:
1.枚举类型:在C语言,本质上是用整型来处理的,枚举值--标识符,默认从0开始,依次往后(每个比前一个大1)。
2.枚举类型的变量的取值范围本质上,只要是整数,都可以接收,只是我们在使用时,一般,只是用,定义在枚举类型中的值。
3.枚举类型的值也可以指定。
4.枚举是编译时处理,有类型,宏定义是预处理阶段,无类型只是文本替换。枚举把相关的值集合起来更可读,宏定义没有这样的效果。
5.枚举有类型,可以做类型检查。
6.用枚举来定义常量
#define ARRAYSIZE 10
enum
{
ARRAYSIZE=10,
};//定义了一个符号常量
typedef :type define//给已有类型起别名
typedef int a//此时给int起了一个别名--别名就叫a
typedef struct
{
charname[10];
intage;
}stu_t;
struct stu s; == stu_t s;
三、位运算
所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进制位的问题,例如,将一个存储单元中的各二进制位左移或右移一位,两个数按位相加等。C语言提供位运算的功能,与其他高级语言(如PASCAL)相比,它显然具有很大的优越性。
位--二进制位
通过软件控制硬件:通过位运算--实现二进制位的操作影响的起始就是二进制位的状态。
&: 与运算(一假则假) 用途:清零。
|: 或运算(一真则真) 用途:置1。
~: 取反运算(真假相对) 用途:实现两个数交换。
^: 异或运算(相同为0,不同为一)
<<: 左移;将二进制位向左移动指定位数,低位补0。
>>: 右移;将二进制位向右移动指定位数,逻辑右移(无符号)最高位补0;
算术右移(有符号)最高位补符号位。
不借助第三方变量实现两个数交换
a = a + b;
b = a - b;
a = a - b;
异或实现交换
a = a ^ b;
b = a ^ b;
a = a ^ b;
注意:
1.位运算不支持浮点数据。
2.左移一位相当于乘以2。
3.每右移一位相当于除以2.
循环左移:
#include
int main()
{
int a = 0xf0000000;
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
if((a & 1<< 31) !=0)
{
a = (a << 1) + 1;
}else
{
a = a << 1;
}
}
printf("a = %#x
",a);
return 0;
}
总结C语言重点:
重要点:
1.隐式类型转换
2.不同精度混合赋值
3.数组理解数组特点掌握数组算法
a.找数
b.找极值
c.逆序
d.排序选择冒泡插入快速排序
e.二分找字符串
理解字符串:gets; puts ;strlen; strcpy / strncpy ;strcat / strncat ;strcmp / strncmp。
二维数组理解本质
4.函数:函数的定义;函数的声明;函数的调用;函数递归调用。
存储类别的关键字---关键字:static extern register auto
5.指针:指针概念;指针定义;指针引用(*p);指针运算(p++,p+n,p-q,关系运算)。
指针 + 数组:一维;二维;
指针数组-----数组
数组指针-----指针
指针+函数:函数 (的)指针------回调;指针 (的)函数-------返回值为指针
指针+指针:多级指针。
特殊的指针:野指针;NULL; void * //空类型指针










