一、memcpy
void* memcpy(void* dest, const void* src, size_t num)
notes: strcpy与memcpy区别 1、strcpy()字符串拷贝,它的拷贝结束是需要'\0'的,同时只针对字符串
2、memcpy()什么类型都可以拷贝,同时可以规定拷贝的个数
各传入参数的含义:
(1)dest:即将被拷贝进去的首地址
(2)src:用于拷贝的元素的首地址(因为源地址的内容是不需要改变的因此可以定义为const void* 类型)
(3)num:一共要拷贝的字节数,是一个字节一个字节的拷贝
memcpy()函数的运用
int main()
{
int arr3[] = { 1, 2, 3, 4, 5, 6, 7, 9, 8, 10 };
int arr4[5] = { 0 };
memcpy(arr3, arr4, 5 * sizeof(arr3[0]));
for (int i = 0; i < 5; i++)
{
printf("%d ", arr3[i]);
}
return 0;
}
my_memcpy()模拟实现
#include <stdio.h>
#include <assert.h>
//memcpy模拟实现void *memcpy( void *dest, const void *src, size_t count );
void* my_memcpy(void* dest, const void* src, int count)
{
assert(dest && src);
for (int i = 0; i < count; i++)
{
*((char*)dest + i) = *((char*)src + i);
}
}
int main()
{
char arr1[] = "hello************";
char arr2[] = "www";
my_memcpy(arr1, arr2, 2);
printf("%s\n", arr1);
return 0;
}
二、memmove
void* memmove (void* dest, const void* src, size_t count);
notes:memmove和memcpy的区别1、memmove()可以进行对内存重叠的拷贝
2、memcpy()C语言规定只拷贝不重叠的内存,但在VS上也能实现重叠拷贝,无法保证所有编译器都可以
memmove()函数应用
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
memmove(arr + 1, arr + 3, 20);
for (int i = 0; i < 11; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memmove()模拟实现
#include <stdio.h>
#include <assert.h>
//memmove模拟实现void *memmove( void *dest, const void *src, size_t count );
void* my_memmove(void* dest, void* src, int count)
{
if (dest > src)
{
for (int i = count-1; i >= 0; i--)
{
*((char*)dest + i) = *((char*)src + i);
}
}
else
{
for (int i = 0; i < count; i++)
{
*((char*)dest + i) = *((char*)src + i);
}
}
}
void show_arr(int* p, int sz)
{
for (int i = 0; i < sz; i++)
printf("%d ", p[i]);
printf("\n");
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
show_arr(arr, sz);
my_memmove(arr, arr + 3, 20);
show_arr(arr, sz);
}