动态内存与构造类型
一,动态内存
1,概念
动态内存:由管理员进⾏申请内存空间来使⽤(申请⼤⼩也是我们决定)存储数据, 访问数据;管理员⾃⼰进⾏释放内存空间的使⽤⽅式。
动态内存的存储的区域------堆区,它由程序员⾃⼰管理 动态内存的申请与释放是程序员通过调⽤库函数来实现。
2,申请空间
#include < xxx > xxx在这⾥就有对应的库函数
申请空间:在堆空间中申请指定size字节⼤⼩的空间⽤于使⽤,申请成功会 把申请的空间⾸地址(开始地址)返回,如果失败返回NULL(0x0地址)
void * malloc(unsigned int size);
3,释放空间
从堆空间中,释放指定地址ptr对应的空间
void free(void * ptr); free(空间⾸地址);
注:申请的空间一定要记得释放,如果不释放就会一直占用,系统不会自动释放。
二,构造类型
1,概念
构造类型:int、float、double...叫做基础类型,而由这些类型做成的、含有多个的组合类型称为构造类型。
2,结构体
⼀种类型,这种类型由多个部分构成,每个部分只表⽰⼀个信息(内 容),共同组合表⽰⼀个完整的信息内容,⼀个新的类型
类型声明:----说明有⼀个新的类型(不表⽰有这个类型的变量)
struct 结构体名-----表⽰新的类型名
{
数据类型1 成员名1;
数据类型2 成员名2;
数据类型3 成员名3;
........
};
定义结构体变量: struct 结构体名 变量名; 构造类型(⾃定义类型)
初始化: struct 结构体名 变量名 = {值}; 初始化可以部分初始化也可以全部初始化。
使⽤结构体变量: 结构体变量是⼀个整体,包含多个成员的类型 需要单独对结构体变量中的成员进⾏操作
方法: 结构体变量名.成员名 ------访问某个成员
更改结构体中的某一个变量:
方案:strcpy (目标地址,原地址) 含义:将源地址中的字符串复制到目标地址
#include<stdio.h>
#include<string.h>
//声明一个新类型
struct stu
{
//定义一个字符数组用来保存学生的姓名
char name[20];
//定义一个浮点数来表示学生的年龄。
float age;
//定义一个整型来表示学生的性别。
int sex;
};
int main()
{
struct stu s1; //定义结构体 stu 类型变量 s1
//全部初始化
struct stu s2 = {{'x','i','a','o','l','i'},20,1};
struct stu s3 = {{"xiaozhang"},22,2};
//部分初始化
struct stu s4 = {.name = "xiaowang", .sex = 2}; //不初始化年龄,记得使用 . 隔开。
printf("stu s1 age is %f\n",s1.age); //单独访问。
//更改某个变量的信息
//方案:strcpy (目标地址,原地址) 含义:将源地址中的字符串复制到目标地址
strcpy(s2.name,"xiaozhao");
printf("s2.name is %s",s2.name);
}
使⽤结构体指针访问变量内容:
结构体指针: struct 结构体名 指针名; 结构体指针访问:指针名->成员名。
3,共用体
概念:与结构体使⽤⽅式相同,表⽰含义也是相同,只是共⽤体是所有的成员 共⽤同⼀段内存空间
定义:
union 联合体名
{
数据类型1 成员名1;
数据类型1 成员名2;
.............................
};
只是成员1,成员2,....共⽤⼀个空间,每个成员没有单独的空间,空间为 最⼤成员的空间能够整除在共⽤体中最⼤的类型
在使⽤共⽤体时,同⼀时间只能使⽤⼀个成员,这个成员使⽤完,才能再使 ⽤其他成员
4,枚举
概念:有些类型的数据取值范围只能是固定的某些值,这种数据类型限制数据 的取值范围,把能够表⽰的值⼀⼀列举出来,这种类型的变量就只能从 列举的值中取值
定义:
enum 枚举名
{
成员1,//第⼀个成员默认是0,之后的成员是上⼀个成员的值+1
成员2,
成员3,
};