一、共用体
1.1 概念
概念:不同数据类型的成员共用一块内存空间
1.2 共用体的定义
union 共用体名
{
成员列表;
};
说明:
union 是表示共用体的关键字
union 共用体名 表示共用体类型
成员列表: 数据类型 变量名
1.3 共用体类型变量的定义
a) 在定义共用体的同时,定义结构体类型的变量
b) 先定义共用体,在定义共用体类型的变量
c) 在定义共用体的同时不加结构体,定义共用体类型的变量
1.4共用体变量的初始化
union HG
{
int a;
char b;
float c;
};
union HG g={65};
注意:共用体类型的变量在初始化的时候只能初始化一个数据成员只能在不同时刻使用这一块内存空间
1.5 共用体变量的赋值
union HG
{
int a;
char b;
float c;
};
union HG g={65};
共用体变量引用成员:共用体变量名.成员名
g.a=10;
1.6 共用体的大小
共用体的大小按成员里面所占空间最大的数据类型分配
二、枚举
2.1 枚举类型变量的定义和初始化
枚举列表里面都是常量,而且都是固定
enum 枚举名
{
常量//标识符
};
enum 枚举名{标识符1,标识符2…};
说明:枚举列表里面的成员都是整型常量
enum color{red ,yellow ,blue,black,green}
2.2 枚举类型变量的赋值
enum 枚举名 hg;
enum color fd=red;
hg=blue;
说明:枚举列表里面的成员都是整型常量,枚举列表里面如果没有初始化,系统默认从0开始依次递增赋值,列表里面如果进行了初始化,系统会默认从初始化的值开始依次递增,枚举变量的赋值或者初始化的值必须是枚举列表里面的成员。
2.3 枚举的大小
枚举的大小:4个字节
#include<stdio.h>
int main()
{
enum color{red=1 ,yellow ,blue,black=10,green};
enum color hg=green;
// for(hg=red;hg<green;hg++)
// printf("sssssssssssss\n");
printf("%d\n",hg);
}
三、链表
3.1 内存分区
1)代码区/常量区
代码,常量,字符串
2)静态区
特点:变量在定义的时候分配空间,程序执行结束
空间释放
主要存储:全局变量,静态局部变量
分配地址:先分配的是低地址
3)动态区
a)栈区:
特点:函数调用,空间分配,函数结束,空间释放
主要存储:局部变量,函数的形参
分配地址:先分配的高地址
b)堆区
特点:人工申请的空间都在堆区
人工申请要靠内存管理函数来实现
3.2 内存分配
1)自动分配
特点:只要符合 数据类型+变量命名的 方式系统就分配空间
分配位置: 是根据变量的位置决定存储类型关键字的修饰
空间大小:根据数据类型来决定的
注意:空间一旦分配,大小固定,空间大小不能任意改变,会存在空间浪费或者空间大小不足的情况。
2)动态分配
特点:人工申请,靠内存管理函数来实现不会存在空间浪费空间不足的情况,用的时候申请空间,不用的时候就释放空间,空间大小可变。
3、内存管理函数
1)malloc()函数
函数功能:动态申请一块内存空间
函数形式:(数据类型说明符 *)malloc(size)
函数说明: 数据类型说明符:表示空间要存储什么样的类型的数据(数据类型说明符 *) 表示函数返回的是该空间的首地址
size :表示申请的空间大小(以字节为单位)
函数的返回值:返回申请的空间的首地址
int *p;
p=(int *)malloc(4/sizeof(int));
malloc()
sizeof(数据类型)//求数据类型的空间大小
2)calloc()函数
函数功能:动态申请一块内存空间
函数形式:(数据类型说明符 *)calloc(n,size)
函数说明: 数据类型说明符:表示空间要存储什么样的类型的数据
(数据类型说明符 *) 表示函数返回的是该空间的首地址
size :表示申请的空间大小(以字节为单位)
n :申请n块size字节大小的内存空间
函数的返回值:返回申请的空间的首地址
int *p;
p=(int *)calloc(2,4/sizeof(int));
3)free()函数
函授功能:空间释放函数
函数形式:free(void *)
函数说明:void * 表示万能型数据类型
参数表示要传入释放的空间的首地址
注意:只能释放malloc或者calloc申请的内存空间
int *p;
p=(int *)calloc(2,4/sizeof(int));
free(p);
四、链表
概念:由多个节点链接构成的叫做链表
4.1 节点
节点:结构体类型
struct STU
{
//数据域
int num;
char name[10];
int score;
//指针域
struct STU *next;
}
节点里面有:数据域,指针域
4.2 链表的结构
表头:头结点:只有指针域,没有数据域
节点: 既有数据域,也有指针域
表尾:尾节点:只有数据域,没有指针域
4.3 链表的分类
1)静态链表在使用之前已经定义
struct STU
{
//数据域
int num;
char name[10];
int score;
//指针域
struct STU * next;
}a,b,c;
struct STU *head=&a,*p=&a;
a.next=&b
b.next=&c
c.next=NULL;
2)动态链表
1、链表的创建
2、遍历链表
3、节点的插入
4、节点的查询
5、节点的删除
struct STU
{
//数据域
int num;
char name[10];
int score;
//指针域
struct STU * next;
};