1.memcpy
void * memcpy ( void * destination, const void * source, size_t num );
存储器复制块 :将一个数组的值储存到另一个数组
#include<stdio.h>
#include<string.h>
//assert 断言检查
#include<assert.h>
void* myMemcpy(void* destination, const void* source, size_t num)//void* 泛型指针
{
assert(destination && source);
void* ret = destination;
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,};
int arr2[10] = { 0 };
myMemcpy(arr2, arr1, 6);
for (int i = 0; i < 6; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
缺点:因为是从前往后插所以数据会被覆盖(但是visual stdio自己优化了)
优化方法:使用memmove
2.memmove
#include<stdio.h>
#include<string.h>
//assert 断言检查
#include<assert.h>
void* myMemmove(void* destination, const void* source, size_t num)//void* 泛型指针
{
assert(destination && source);
void* ret = destination;
if (destination < source)
{
//从前把数值拷贝到后
while (num--)
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;
source = (char*)source + 1;
}
}
else
{
while (num--)
{
*((char*)destination + num) = *((char*)source + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
myMemmove(arr1+2, arr1, 20);//20byte 相当于移动五个数字
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
但是并不是任何时候都无脑从后拷入数据,要根据实际情况分析
3.memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
比较两个内存块 (完全相等),可以作用于任何数据
4.memset
void * memset ( void * ptr, int value, size_t num );
填充内存块
按照字节初始化