第三周学习笔记
一、内存分区
代码区:可执行文件代码段,不可在信息期间修改,求初始化数据区bss
全局初始化数据区/静态数据区:可执行处还会数据段。
栈区:先进后出的内存结构,有编译器自动分配释放,存放函数的参数值。返回值、局部变量等。
堆区:用于动态内存分配。——堆区内存分配释放:开辟:malloc void*malloc(size_t size);释放:free
二、内存操作函数
#include<string.h>
1、memset() void*memset(void*s,int c,size_t n)——将size内存区域的前n个字节以参数c填入。
2、memcpy() void*memcpy(void*dest,const void*str,size_t n);——拷贝源内存首地址str所指的内存内容的前n个字节到目的内存前地址dest所值的内存地址上。
返回值:dest的前地址
Dest与str的内存空间不可重叠,否则可能会报错。
3、memmove功能约等于memcpy,但dest和str的内存空间重叠时,仍可以执行。
4、memcmp比较两个地址的内存区域的前n个字节。
三、结构体 struct 结构体名 { }
struct 结构体名 stu //创建结构体变量
- 结构体数组
- struct结构体名 {成员列表}数组名[数组长度]
- 先声明一个结构体类型,再定义结构体数组 结构体类型 数组名[数组长度]
- 数组类型初始化形式 定义数组={初始表列}
-
开辟堆空间存储
![]() |
3、结构体和指针
![]() |
Struct Student *p //p是可以指向struct Student类型的变量或数组元素
4、结构体和函数:用结构体变量和结构体变量的指针作为函数参数
- 联合体
- 联合体中起作用的是最后一次存放的成员,存入新成员后悔覆盖原有成员的值
- 联合体变量地址即为各成员变量的地址
- 枚举
Enum 枚举名{枚举元素1,枚举元素2……}
(先定义枚举类型,在=再定义枚举变量)
流水灯代码
1、使用运算符进行移位操作
2、利用位移函数实现左移右移