网站后台发文章图片链接怎么做大连在哪里个省份
2025/12/29 7:09:15 网站建设 项目流程
网站后台发文章图片链接怎么做,大连在哪里个省份,建设机械网站方案,免费搭建购物网站#x1f3e0;个人主页#xff1a;黎雁 #x1f3ac;作者简介#xff1a;C/C/JAVA后端开发学习者 ❄️个人专栏#xff1a;C语言、数据结构#xff08;C语言#xff09;、EasyX、游戏、规划 ✨ 从来绝巘须孤往#xff0c;万里同尘即玉京 文章目录前景回顾#xff1a;字…个人主页黎雁作者简介C/C/JAVA后端开发学习者❄️个人专栏C语言、数据结构C语言、EasyX、游戏、规划✨ 从来绝巘须孤往万里同尘即玉京文章目录前景回顾字符串函数核心速记 一、memcpy不重叠内存的拷贝神器 1. 函数核心要点string.h2. 实战示例拷贝整型数组3. 模拟实现逐字节拷贝4. 注意事项重叠内存的坑 ❗二、memmove处理重叠内存的升级版 1. 函数核心要点string.h2. 核心思路分情况选择拷贝方向3. 模拟实现双向拷贝逻辑三、memset按字节设置内存值 1. 函数核心要点string.h2. 正确用法设置字符数组3. 经典踩坑设置非字符类型数组 ❌四、memcmp按字节比较内存区域 1. 函数核心要点string.h2. 实战示例比较整型数组写在最后 字符串专题收官之后我们迎来C语言内存操作的核心内容这一篇聚焦四大内存函数——memcpy内存拷贝、memmove内存移动、memset内存设置、memcmp内存比较详解它们的使用规则、核心差异和模拟实现逻辑帮你吃透以字节为单位的内存操作底层原理前景回顾字符串函数核心速记 C 语言字符串入门字符函数 strlen 精讲从使用到模拟实现C 语言字符串进阶strcpy/strcat/strcmp 精讲C 语言字符串高阶strstr/strtok/strerror 精讲含 strstr 模拟实现回顾字符串函数的核心特性能帮我们更好理解内存函数的设计逻辑字符串函数依赖\0作为终止标志仅能处理字符类型数据。内存函数不关心数据类型以字节为单位操作内存通用性更强。模拟实现库函数时assert断言指针非空是保证代码健壮性的必备操作。一、memcpy不重叠内存的拷贝神器 memcpy的全称是memory copy作用是从源内存地址拷贝指定字节数的数据到目标内存地址和字符串函数strcpy不同它不会因为遇到\0而停止。1. 函数核心要点string.h函数原型void*memcpy(void*destination,constvoid*source,size_tnum);destination目标内存起始地址source源内存起始地址num需要拷贝的字节数核心特性✅ 不关心内存中存储的数据类型逐字节拷贝✅ 遇到\0不会停止严格按照num指定的字节数拷贝❌仅适用于不重叠的两块内存区域2. 实战示例拷贝整型数组#includestdio.h#includestring.hintmain(){intarr1[]{1,2,3,4,5};// 占 5*420 字节intarr2[10]{0};// 拷贝arr1的20个字节到arr2memcpy(arr2,arr1,20);// 打印arr21 2 3 4 5 0 0 0 0 0for(inti0;i10;i)printf(%d ,arr2[i]);return0;}3. 模拟实现逐字节拷贝memcpy的模拟实现核心是强转为char*类型因为char*每次操作正好是1个字节完美匹配内存函数的设计逻辑。#includestdio.h#includeassert.hvoid*my_memcpy(void*dest,constvoid*src,size_tnum){assert(destsrc);// 断言指针非空void*retdest;// 保存目标起始地址用于返回// 逐字节拷贝while(num--){*(char*)dest*(char*)src;src(char*)src1;dest(char*)dest1;}returnret;}// 测试代码intmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};intarr2[10]{0};my_memcpy(arr2,arr1,20);// 拷贝前5个整型元素for(inti0;i10;i)printf(%d ,arr2[i]);return0;}4. 注意事项重叠内存的坑 ❗如果用my_memcpy处理重叠内存会出现数据覆盖问题// 错误案例拷贝重叠区域intarr[]{1,2,3,4,5,6,7,8,9,10};// 想把 {3,4,5,6,7} 拷贝到 {1,2,3,4,5} 的位置my_memcpy(arr,arr2,20);// 实际输出{3,4,3,4,3,6,7,8,9,10} → 数据被覆盖原因是my_memcpy是从前往后拷贝先拷贝的内容会覆盖后面待拷贝的数据。 补充VS2022等编译器对memcpy做了优化能处理重叠内存但标准C规定memcpy只负责不重叠内存跨平台开发时要严格遵守标准重叠内存请用memmove。二、memmove处理重叠内存的升级版 memmove的全称是memory move它是memcpy的增强版支持重叠内存区域的拷贝是实际开发中更安全的选择。1. 函数核心要点string.h函数原型void*memmove(void*destination,constvoid*source,size_tnum);参数含义和memcpy完全一致。核心优势✅ 兼容重叠内存和不重叠内存的拷贝✅ 底层通过判断拷贝方向从前往后/从后往前避免数据覆盖2. 核心思路分情况选择拷贝方向我们以数组{1,2,3,4,5,6,7,8,9,10}为例分析dest和src的位置关系确定拷贝方向内存位置关系拷贝方向原因dest src目标在源左边从前往后先拷贝的内容不会覆盖待拷贝数据dest src目标在源右边从后往前避免先拷贝的内容覆盖后面的数据3. 模拟实现双向拷贝逻辑#includestdio.h#includeassert.hvoid*my_memmove(void*dest,constvoid*src,size_tnum){assert(destsrc);void*retdest;if(destsrc)// 情况1目标在源左边 → 从前往后拷贝{while(num--){*(char*)dest*(char*)src;src(char*)src1;dest(char*)dest1;}}else// 情况2目标在源右边 → 从后往前拷贝{while(num--){// 从最后一个字节开始拷贝*((char*)destnum)*((char*)srcnum);}}returnret;}// 测试重叠内存拷贝intmain(){intarr[]{1,2,3,4,5,6,7,8,9,10};// 把 {3,4,5,6,7} 拷贝到 {1,2,3,4,5} 的位置my_memmove(arr,arr2,20);// 正确输出3 4 5 6 7 6 7 8 9 10for(inti0;i10;i)printf(%d ,arr[i]);return0;}三、memset按字节设置内存值 memset的全称是memory set作用是以字节为单位将指定内存区域的每个字节都设置为目标值。它是初始化内存的常用工具但极易因使用不当踩坑。1. 函数核心要点string.h函数原型void*memset(void*ptr,intvalue,size_tnum);ptr要设置的内存起始地址value要设置的字节值虽然参数是int但实际只取低8位num要设置的字节数核心特性✅ 逐字节设置值不是逐元素✅ 常用于初始化字符数组或把内存置为02. 正确用法设置字符数组#includestdio.h#includestring.hintmain(){chararr[]hello world;// 从第3个字符开始连续设置5个字节为 xmemset(arr2,x,5);printf(%s\n,arr);// 输出hexxxxxldreturn0;}3. 经典踩坑设置非字符类型数组 ❌很多人会用memset初始化整型数组结果和预期不符#includestdio.h#includestring.hintmain(){intarr[]{1,2,3,4,5,6,7,8,9,10};// 想把数组每个元素设为1 → 实际是每个字节设为1memset(arr,1,40);// 数组占 10*440 字节return0;}内存监视结果每个整型元素的4个字节都被设为0x01因此每个元素的值是0x01010101十进制 16843009完全不是预期的1 结论memset仅适合设置单字节数据如char或把内存置为0value0时任何类型元素都是0。四、memcmp按字节比较内存区域 memcmp的全称是memory compare作用是以字节为单位比较两块内存区域的前num个字节。它和strcmp的区别是不依赖\0可比较任意类型数据。1. 函数核心要点string.h函数原型intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnum);ptr1/ptr2要比较的两块内存起始地址num要比较的字节数返回值规则▶ 若ptr1 ptr2→ 返回大于0的值▶ 若ptr1 ptr2→ 返回0▶ 若ptr1 ptr2→ 返回小于0的值2. 实战示例比较整型数组#includestdio.h#includestring.hintmain(){intarr1[]{1,2,3,4,5};// 内存布局01 00 00 00 02 00 00 00 ...intarr2[]{1,2,3,4,0x12333301};// 第5个元素内存01 33 33 12// 比较前17个字节前4个元素第5个元素的第1个字节intrmemcmp(arr1,arr2,17);printf(%d\n,r);// 输出正数arr1第17字节是05arr2是01return0;}写在最后 内存操作函数是C语言直接操控内存的核心工具和字符串函数相比它们的通用性更强适用范围更广但也更容易因忽视字节操作的特性而踩坑。掌握这些函数的关键在于三点区分memcpy和memmove的使用场景重叠/不重叠内存牢记memset是逐字节设置而非逐元素理解memcmp的比较规则是基于字节的ASCII码值。这些函数的模拟实现逻辑也是笔面试中考察指针和内存操作的高频考点建议大家手动敲一遍代码加深对底层原理的理解。至此C语言字符串和内存操作的核心内容就全部讲解完毕啦

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询