网站开发需求大吗,wordpress响应式按钮,wordpress 导出功能,手机软件是怎么做出来的本文主要探讨C语言的内存和为操作操作相关知识。
冯诺依曼结构和哈佛结构 冯诺依曼结构#xff1a;数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是#xff1a;数据和代码分开存放,安全性高,读取和修麻烦
内存 内存是用来存储全局变量、局…本文主要探讨C语言的内存和为操作操作相关知识。
冯诺依曼结构和哈佛结构 冯诺依曼结构数据和代码放在一起,便于读取和修改,安全性低 哈佛结构是数据和代码分开存放,安全性高,读取和修麻烦
内存 内存是用来存储全局变量、局部变量等变量 操作系统把内存分成4kb页面以为单位来管理 页面内以字节为单位通过管理接口(API)管理内存
内存属性 内存属性:地址和空间 空间内存单元大小 地址内存条上的实际位置(物理地址)和逻辑地址地址编号一一对应 内存单元类似方格方格的位置为物理地址方格的编号为逻辑地址方格的空间为内存单元空间大小
内存和数据类型 int类型与CPU数据位宽相同,32位的CPU的位宽是32位,int类型为32位占4字节 数据类型表示内存单元长度和解析方式 int读取过程中,从起始处读取4个字节单元再int的方式解析读取的内容
内存对齐 内存对其访问效率高 int类型变量对齐与非对齐 对齐 0 1 2 3 非对齐 1 2 3 4
变量访问内存 int a;编译器申请int类型内存内存单元把a和内存单元绑定 a 5;内存单元空间中写入5 a 4; 编译器先读a值再加4最后重写写入到内存单元。
指针间接访问内存 int a;int *p; a和p代表内存地址,内存地址长度和解析方法不同 a为int型长度是4字节解析方式是int p是int *类型长度是4字节解析方法是int *
数组访问内存 int b[10]; 编译器分配40个字节长度给b首元素地址和b绑定 每个元素类型都是int长度是4字节 第一个字节地址为首地址首元素a[0]地址为首地址 栈(stack) 自动分配和回收内存 内存空间可反复使用 内存使用完不会清理使用前需初始化 操作系统固定了栈大小变量定义防止栈溢出 栈变量指针空间是临时的同一变量每次初始化使用的是不同的内存地址空间 堆heap 堆管理内存分配灵活按需分配 内存按需申请使用使用完释放 内存空间可反复使用 内存使用完不会清理使用前需初始化
内存申请 void *malloc(size_t size); void *calloc(size_t nmemb, size_t size); // nmemb个单元每个单元size字节 void *realloc(void *ptr, size_t size); // 改变原来申请的空间的大小的 malloc用来申请内存,返回void *类型指针,malloc返回申请内存空间首地址失败返回NULL malloc只分配内存空间空间存储的数据类型不做定义
段
代码段程序中可执行部分 数据段数据区、静态数据区、静态区初始化为非零的全局变量,静态局部变量 bss段ZI段初始化为0或未初始化的全局变量
特殊数据 char *p linux;字符串分配在代码段,是常量不是变量 单片机编译过程中将const修饰变量放在代码段实现不能修改 gcc编译器将const修饰的变量放在数据段,只是默认不可修改实际可通过地址访问修改
位32位操作系统 位1bit 字节8bit 半字16bit 字32bit
位操作 位操作与 或| 取反~ 异或^ 左移 右移 位清0 : 0 位置1 : | 1 位取反 : ^ 1 特定位设置 #define SET_NTH_BIT(x, n) (x | ((1U)(n-1))) 特定位清除 #define CLEAR_NTH_BIT(x, n) (x ~((1U)(n-1))) 截取特定位 #define GETBITS(x, n, m) ((x ~(~(0U)(m-n1))(n-1)) (n-1))
demo: 位清除设置截取练习
#include stdio.hint main()
{int a 0x8a66;//设置bit3a | (13);printf(bit3 set %x\n,a);//设置bit3 ~ bit8a | (0x1f 3);printf(bit3-8 set %x\n,a);//清除bit5a ~(1 5);printf(bit5 clear :%x\n,a);//清除bit6 ~ bit12a ~(0x3f 6);printf(bit6-12 clear :%x\n,a);//设置bit9 ~ bit14为9a ~(0x1f 9);a | (12 9);printf(set 12 in bit9-14 :%x\n,a);//bit6 ~ bit12 加9,bit4 ~ bit7 加7int tmp ((a (0x3f 6)) 6) 9;a (a ~(0x3f 6)) | (tmp 6);tmp ((a (0xf 1)) 1 ) 7;a (a ~(0xf 1)) | (tmp 1);printf(bit6-12 9 and bit1-4 7 %x\n,a);return 0;
}
结果示例