目录
1.memcpy函数
mem -- memory -- 记忆 -- 内存 cpy -- copy -- 拷贝
strcpy - 字符串的拷贝 memcpy - 针对内存块进行拷贝;
memcpy(arr2,arr1,20) ---- arr2 是拷贝到的地址 , arr1 是拷贝的地址,20 是元素字节的大小
函数类型:void * memcpy ( void * destination, const void * source, size_t num ),void* 指针存放的是各种类型.
size_t count 是元素字节的大小
函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置;
这个函数在遇到'\0'的时候并不会停止下来;
重点:如果source和destination有任何的重叠,复制的结果都是未定义的;
memcpy拷贝完成之后,会返回目标空间的起始地址;
2.memmove函数
函数类型: void * memmove ( void * destination, const void * source, size_t num );
1,和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的;
2,如果源空间和目标空间出现重叠,就得使用memmove函数处理;
memmove函数拷贝完成之后,会返回目标空间的起始地址;
注:在函数模拟实现时:可分为俩种情况
第一种:如果dest在src前面的话,从前向后排;
第二种:如果src在dest前面的话,从后往前排;
memove函数的模拟实现:
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
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, arr+2, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
模拟结果:
3.memset函数
函数类型:void * memset ( void * ptr, int value, size_t num );
memset是用来设置内存的,将内存中的值以字节为单位设置成想要的内容;
函数的运用: 把hello,world 的前5个字符改成字符x;
4memcmp函数
函数类型:int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比较ptr1和ptr2指针指向的位置开始,向后的num个字节;
返回值如下:
例: