联合体
union ***{
};
联合体也是一种特殊的自定义数据类型,这种类型定义的变量也包含一系列成员,特点是这些成员共用同一块空间(所以联合体也叫共用体)
联合体的成员共用一块空间(地址相同)
联合体的大小至少是最大成员的大小
当最大成员大小不是所有成员最大位置偏移大小的整数倍时,联合体的整体大小就是所有成员最大位置偏移大小的整数倍
最大位置偏移大小:如int是4,char是1,char arr[5]也是1
在64位的系统中(比如win64)1字(word)= 8字节(byte)=64(bit)
枚举
enum ***{
* ,
*
};
把可能的值一一罗列出来
枚举是一种类型(宏不是类型)
枚举的是整形,如果不赋值会默认从0开始,依次递增
枚举的优点
1. 增加代码的可读性和可维护性
2. 和#define定义的标识符比较,枚举有类型检查,更加严谨
3. 防止命名污染
4.使用方便,一次可以i定义多个常量
位域(位段)
位域可以把一个字节分成好几段,每一段都可以存储数据
struct **{
int a:8;
int b:4;
...
};
一,位域类型的声明
1. 带有预定义宽度的变量被称为位域
2. 位域必须是int 、unsigned int、 signed int、char和unsigned char类型
3. 位域后边有一个冒号和一个数字(所占二进制位的大小)
会占用4byte的空间(int),但是只有2byte被用来存储
1byte(字节)=8bit(比特)
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后
二,位域说明
1.如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始
2.位域可以是无名位域,这时它只用来填充或调整位置。无名位域不能使用
空域可用来调整存储数据的位置
3,位域的宽度不能超过他所依附的数据类型的长度
内存管理
C语言运行时的内存分配
static关键字
可以修饰变量(全局变量,局部变量)和函数
用static修饰的局部变量可以延长其生命周期
修饰全局变量会限制其使用范围,只能在本文件使用,其他文件不能用(一般不用)
动态内存分配
<1>malloc(开辟空间)
<2>free(释放空间)
<3>calloc(开辟空间)
<4>realloc(开辟空间)
*void是任何类型
void是空类型
柔性数组
C99中,结构体中的最后一个元素允许是未知大小的数组,就叫做[柔性数组]的成员
strlen
返回在字符串中”\0“前面出现的字符个数(不包括\0)
strcmp(n1,n2)
比较字符大小,前者如果大于后者返回值大于零
等于则返回零,小于则返回小于零
strstr
查找str1和str2是否存在,如果存在