赞
踩
目录
正文
使用内存函数时需要包含的头文件为 <string.h>
1、memcpy函数
1.1、memcpy函数的使用
memcpy与strcpy 是有相同点的,我们已知strcpy函数是用来对字符串进行拷贝的,且只能进行字符串的拷贝。
strcpy—— string 字符串,copy 拷贝
memcpy—— memory 代表内存 ,copy 拷贝
顾名思义,memcpy函数是针对内存块的拷贝。
其参数:destination——目标空间,source——源数组,num——进行拷贝的字节个数
所以,memcpy的函数功能为:从source的位置开始向后复制num个字节的数据拷贝到destination指向的内存位置。
memcpy函数可以拷贝内存中任意类型的数据,那么它可以代替strcpy函数进行字符串的拷贝吗?
memcpy函数可以拷贝字符串,但它在遇到'\0'时不会停下来。而strcpy函数会将源字符串中的'\0'拷贝到目标空间后结束。
使用前提:destination数组与source数组不能有内存的重叠。
如上图,在拷贝时若将对应字节都拷贝完成之后,arr2中剩余的空间补0 。
1.2、memcpy模拟实现
注:先附完整代码,然后进行代码详解。
函数代码:
1.21、代码详解
函数参数部分详解:
强制转换部分详解:
2、memmove函数
2.1、memmove函数的使用
上述内容讲到,memcpy的使用前提是destination数组与source数组不能有内存的重叠。而有内存重叠的数据进行拷贝就要用到memmove。
简单来讲,memcpy是将数组1的num个字节拷贝到数组2中,是两个不同的空间进行拷贝;而memmove是将数组1的num个字节拷贝到数组1的其他位置中,覆盖掉了原本的数据。
memmove函数的功能:将 从source的位置开始向后复制num个字节的数据拷贝到destination指向的内存位置。其中,source可以与destination相等,即有重叠。
使用memmove函数:
所以是将12345,拷贝到34567的空间中,覆盖了原来的数据。
打印结果为1 2 1 2 3 4 5 8 9 10
2.2、memmove模拟实现
注:先附完整代码,然后进行代码详解。
完整代码:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include <stdio.h>
- #include <assert.h>
- void* my_memmove(void* dest, const void* src, size_t num)
- {
- void* ret = dest;
- assert(dest && src);
-
- if (dest < src)
- {
- //正序
- while (num--)
- {
- *(char*)dest = *(char*)src;
- dest = (char*)dest + 1;
- src = (char*)src + 1;
- }
- }
- else
- {
- //反序
- while (num--)
- {
- *((char*)dest + num) = *((char*)src + num);
- }
- }
- return ret;
- }
- int main()
- {
- int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
- my_memmove(arr + 2, arr, 20);
- int i = 0;
- for (i = 0; i < 10; i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }
2.21、代码详解
思路:
逐图讲解:
图1: dest为高地址,在src前面,在对src、dest进行交换时,如果将src从 前-->后 的顺序(正序)进行交换时 ,换到3时源数据被覆盖,需要将src从 后-->前 的顺序(反序)进行交换。
注:进行交换时,src、dest的正/反序 交换的顺序一样,均为正序或反序。
图2: dest为低地址,在src后面,在对src、dest进行交换时,将src从 前-->后 的顺序(正序)进行交换。 反序交换会被覆盖。
图3:src、dest的空间没有重叠。既可以正序交换,有可以反序交换。
则可以得到以下结论:
故,我们现在在进行拷贝时有两种方法:
- 让重叠部分使用反序,则以src处为分界点,之前为正序,之后为反序,分为两部分
- 让重叠部分使用正序,则以src与src终点为分界点,分为三部分
上面的代码使用的是方法1(分为两部分) 。
3、memset函数的使用
ptr : 指向要被设置的内存块
value : 要设置的值
num : 设置为value的字节个数
功能:将ptr指向的空间中num个字节的每个字节设置为value值
函数使用:
说明:将字符串str中的6个字节设置为‘x’
3.1、注意事项
memset函数在对整型数组进行设置时,一定要注意:
memset函数是以字节为单位进行设置的,做不到以元素为单位来设置。
举例说明:
想要将数组arr中的5个元素均设置为1,写下了以下代码
但打印出来的数组内容非全1
所以在把memset函数对整型数组使用时,要慎重!!!
4、memcmp函数的使用
memcmp函数是针对内存块的比较。
功能:比较从ptr1和ptr2指针指向的位置开始,向后的num个字节。
返回值:
若ptr1 > ptr2 ,返回>0的数
若ptr1 = ptr2 ,返回=0的数
若ptr1 < ptr2 ,返回<0的数
5、谢谢观看
篇幅有点长,非常感谢能看到最后。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。