ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

c语言 第八章:内存管理、位运算

c语言 第八章:内存管理、位运算 1.操作系统内存管理①内存分布②堆和栈的区别栈区1. 栈区用来保存局部变量、函数的形参返回值、及函数调用时的保护现场2.栈区由操作系统自动管理3.栈区默认大小为8M 比堆区空间小4.栈的访问效率要比堆的访问效率高堆区1.堆区由开发人员手动申请和释放使用完时及时释放否则造成内存泄露。2.堆区空间比栈空间大访问效率相对较低。③堆区空间使用场景在函数中开辟的空间希望随着函数结束该空间任然存在可以去堆上开辟。当需要的空间比较大时可以去堆上开辟栈区空间有限默认8M。堆区空间使用动态内存分配void *malloc(size_t size);功能向堆区申请内存空间参数size申请的空间字节数返回值成功返回申请到的空间首地址失败NULLvoid free(void *ptr);功能释放申请的堆区空间参数ptr申请到的堆区的空间首地址。void *calloc(size_t nmemb, size_t size);功能向堆区申请数组空间并清空成0参数nmemb申请的数组的元素个数size数组中的每个元素占的字节数返回值成功返回申请到的空间首地址失败NULL内存泄露程序运行过程中堆区申请的空间在使用完没有释放则造成内存泄露。避免内存泄露堆区申请的空间使用完及时使用free()进行释放。动态数组int *pa malloc(ARRAY_LEN*sizeof(int));if (NULL pa){printf(malloc error\n);return 0;}for (int i 0; i ARRAY_LEN; i){pa[i] i;}for (int i 0; i ARRAY_LEN; i){printf(%d , pa[i]);}printf(\n);2.位运算①位运算基础按位与 全1为1有0则0|按位或 有1则1全0为0^按位异或 相同为0相异为1~按位取反1取反为00取反为1按位左移 按位左移低位补0 num n num * 2^n按位右移 按位右移动有符号数高位补符号位无符号数高位补0num n num / 2^n9 60000 0000 0000 0000 0000 0000 0000 1001 0000 0000 0000 0000 0000 0000 0000 01100000 0000 0000 0000 0000 0000 0000 00009 | 60000 0000 0000 0000 0000 0000 0000 1001 |0000 0000 0000 0000 0000 0000 0000 01100000 0000 0000 0000 0000 0000 0000 11119 ^ 60000 0000 0000 0000 0000 0000 0000 1001 ^0000 0000 0000 0000 0000 0000 0000 01100000 0000 0000 0000 0000 0000 0000 1111~9~0000 0000 0000 0000 0000 0000 0000 10011111 1111 1111 1111 1111 1111 1111 01109 30000 0000 0000 0000 0000 0000 0000 1001 30000 0000 0000 0000 0000 0000 0100 10009 30000 0000 0000 0000 0000 0000 0000 1001 30000 0000 0000 0000 0000 0000 0000 0001②位运算的使用a.指定n位置10000 0000--》0000 10000000 0001 30000 10001010 0000 |0000 10001010 1000num num | 1 n;1010 0001 | 0000 0001 60100 00001110 0001b.指定第n位清01010 1010 ~(1 3)1111 01111010 00101111 0111 ~0000 1000 ~(1 3)num num ~1 n;0011 1100 1010 1010 ~(1 10) ~(1 11)1111 1011 1111 11110011 1000 1010 10101111 0111 1111 11110011 0000 1010 10100000 0100 0000 00001111 1011 1111 1111c.两数交换(不使用中间变量)方法一位运算无中间变量a a ^ b;b a ^ b;a a ^ b;》a ^ a 0a ^ 0 ab (a ^ b) ^ b a ^ b ^ b a ^ (b ^ b) a ^ 0 a;a a ^ b a ^ b ^ a 0 ^ b b;方法二有中间变量int tmp 0;tmp a;a b;b tmp;方法三求和方式无中间变量a a b;b a - b; a b -b aa a - b; a b - b a b - a位运算符的优先级~大于 大于大于^大于|
返回列表