C语言内存函数之 memcpy和memmove函数

memcpy函数的记忆方法:mem表示内存类函数,属于头文件string.h里面的函数。cpy是copy的缩写,表示对内存数据进行拷贝。

memcpy函数的输入值和返回值:void* my_memcpy(void*brr,void*arr,size_t v) memcpy的输入值分别是被拷贝数据的brr的无类型数组的首地址,然后是拷贝给别人的无类型数组的首地址arr,最后是size_t类型的需要拷贝的字节数v。

memcpy函数的自我实现:

void* my_memcpy(void*brr,void*arr,size_t v){

for (int x = 0; x < v; x++) { //用v来限制x的自增大小最值,x来确定拷贝的地方

*((char*)brr + x) = *((char*)arr + x); //用强制类型转换来一个字节一个字节的拷贝,以char类 型来强制类型转换刚好可以一个字节一个字节的搬运内 存数据。

}

return brr; //最后返回无类型的地址brr,所以接受的时候注意强制类型转换

}

**memmove函数的记忆方法:**mem表示内存类函数,属于头文件string.h里面的函数。move表示搬运,和拷贝的意思是差不多的,但是它复制的方向和memcpy不同。

memmove函数的传入值和返回值:void* my_memmove(void* brr, void* arr, size_t v)

这里 和strcpy函数是相同的。

memmove函数的自我实现:

void* my_memmove(void* brr, void* arr, size_t v) {

for (int x = v - 1; x >= 0; x--) { //这里就是把赋值的顺序反过来了

*((char*)brr + x) = *((char*)arr + x);

}

return brr;

}

为什么要这么能呢?

肯定有其原因:

如果现在你要把123向后移动两位,你要怎么做呢?如果你是把1先放在3处,再把2放在4处,你要移动3发现你的3被1覆盖了。所以这里就可以看出我们从前向后复制是不能用memcpy的。那么我们用memmove呢,先移动3到5,再移动2到4,再是1到3。发现完全没有问题。那么如果我们把3 4 5向前移动2位能不能用memmove呢,答案是不行的,你们可以自行试一试。这里就要相反来搞了,用memcpy。

那么我们能不能自己设定一个函数来将两个函数的功能结合起来呢?

当然是可以的。我们观察上面两种情况,发现就是一个在前一个在后的问题,在前的如果复制到后面去就要先从后面赋值。反之就应该前面的先复制到前面去。

代码实现:

做一个判断就行了。

相关推荐
瑶池酒剑仙2 小时前
C++类和对象完全指南:从封装继承多态到内存布局的面向对象宝典(雨夜论道)
c语言·开发语言·c++·visual studio
三品吉他手会点灯2 小时前
C语言学习笔记 - 27.C编程预备计算机专业知识 - 什么是字节
c语言·开发语言·笔记·学习
邪修king6 小时前
C++ 继承超全详解:核心语法、作用域、默认函数、菱形继承与避坑指南
c语言·c++
djarmy7 小时前
C 标准库 `<stdio.h>` 完整函数清单(官方标准 + 常用全部函数)
c语言·c++·算法
handler019 小时前
速通蓝桥杯省一: 前缀和&差分(附经典例题)
c语言·c++·笔记·职场和发展·蓝桥杯
谙弆悕博士9 小时前
快速学C语言——第 11 章:指针与数组
服务器·c语言·开发语言·学习方法·业界资讯·指针·数组
薇茗10 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树3
c语言·数据结构·二叉树·经典oj面试题
袁雅倩199718 小时前
当吸尘器、筋膜枪都用上Type-C,供电方案该怎么选?浅谈PD取电芯片ECP5702的应用
c语言·开发语言·支持向量机·动态规划·推荐算法·最小二乘法·图搜索算法
CHANG_THE_WORLD1 天前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
消失的旧时光-19431 天前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法