1.联合union
与结构体相类似,只是结构体可以保存多个成员的信息,而联合只能保存一个成员的信息。
语构规则:
typedef union{
成员;
}别名;
2.枚举
a.描述一组有规律数据
b.文本来区分数据,更容易区分数据
c.规范数据的范围
语法规则:
enum 枚举名称{枚举的值1,枚举的值n};
枚举除了声明部分,是不可以修改的。
如果在声明的时候修改了枚举的值,后面的值是前面的值加1
枚举的值默认是从0开始。
练习:SPR SUM AUT WIN
使用枚举的值来描述季节,输入一个数字,并输出相应的季节。
3.任意类型指针void*
可以指向任意类型的内存区域。
但使用前必须进行类型转换
void *p = &i;
int *p2 = (int *)p;//强制类型转换
*p2… //确定了具体的类型才可以寻址
4.函数指针
指向函数所在内存中的地址。
语法格式:
返回值类型(*函数指针变量名)(参数类型 参数名);
函数指针可以调用函数
函数指针可以作为参数
Block…
5.堆内存管理
进程内容空间:
代码区:只读 字符串/函数
栈区:读写 变量
全局区:读写 全局变量/静态变量
堆区:读写 任意类型数据
代码区、栈区、全局区是自动内存管理。操作系统
堆区是由程序员手动内存管理。
堆区最大的特点:由程序员开辟内存空间,销毁内存空间。
在C语言中,通过4个函数就可以管理内存。
a.malloc
语法格式:空间的首地址 = malloc(空间大小/字节)
分配(申请)一个堆内存空间。
分配内存如果成功,则返回分配空间的首地址。
如果分内存失败,则返回一个NULL值(空)。
void* p = malloc(申请空间大小/字节);
#include <stdlib.h>
b.calloc
分配(申请)一个堆内存空间,分配内存空间后,会进行清零或初始化操作。
语法格式:空间的首地址 = calloc(元素个数,元素大小);
c.realloc
对以经申请的空间大小不满意,是可以调整该空间大小的。
调整空间的时候存在两种情况,则在原来的位置调整,如果原来的位置不可以调整,则创建一个新的位置,并且将原来数据复制到新空间,并自动销毁原来的内存空间。
int *newP = realloc(p, NULL); -> free()相等
int *newP = realloc(NULL, sizeof(int)*5);
->malloc()相等
d.free
语法格式:free(首地址);
可以释放、销毁堆内存空间。e.野指针
当堆内存销毁的时候,指针变量的值依然存在,指向了一个不合法的内存区域,野指针。
f.空指针
空指针可以解决野指针问题,当堆内存销毁的时候,有责任将指针变量置空,避免访问不合法的内存区域。
总结:需要使用堆空间,要开辟堆内存空间,使用完毕后,程序员有责任将内存空间释放掉,注意野指针问题。