//void* memcpy(void* destination, const void* source, size_t num);
//void*可以接收任意类型的指针,运算或者解引用时必须先进行强制类型转换;destination是目标空间起始位置;source是源空间的起始位置;num的单位是字节
//memcpy的返回值是目标空间的起始位置,即destination
//即memcpy是将源空间的前num个字节拷贝到目标空间
// memcpy是内存拷贝函数,内存不是字面意思,它指的是内存中存储的任意类型的数据
// strcpy只能拷贝字符串,而memcpy可以拷贝任何类型的数据
//(函数需要包含头文件
//memcpy不适用于destination和source有内存重叠的情形,该情形专门由下一个讲到的mememove函数来处理
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 2,4,6,8,10 };
memcpy(arr1, arr2, 20); //20的单位是字节
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]); //2 4 6 8 10 6 7 8 9 10
}
return 0;
}
void* my_memcpy(void* arr1, const void* arr2, size_t num)
{
void* ret = arr1;
while (num--)
{
*(char*)arr1 = *(char*)arr2;//强制类型转换只是在该语句中,该语句执行完又会恢复到原来的类型,即强制类型转换都是临时性的
((char*)arr1)++;
((char*)arr2)++;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[] = { 2,4,6,8,10 };
my_memcpy(arr1, arr2, 20); //20的单位是字节
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]); //2 4 6 8 10 6 7 8 9 10
}
return 0;
}
//相对于memcpy,memmove专门解决目标空间和源空间的内存重叠问题
//(函数需要包含头文件
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr + , arr + 2, 240);
//arr是数组名,表示数组首元素地址;arr + 4是数组第五个元素地址;arr + 2是数组第三个元素地址;20的单位是字节(即5个int类型数据)
//arr + 4是目标空间的起始地址,arr + 2是源空间的起始地址,即从arr + 2的位置开始向后复制20个字节(5个int型)的数据到以arr + 4为起始地址的目标空间
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]); //1 2 3 4 3 4 5 6 7 10
}
return 0;
}
//如果源空间和目标空间出现重叠:当目标空间的起始位置大于源空间的起始位置(即目标空间起始位置相对于源空间起始位置而言是较高地址)时,源空间内存储的数据从高地址向低地址的顺序依次拷贝到目标空间;其他情况均是从低地址向高地址的顺序依次拷贝
void* my_memmove(void* arr1, const void* arr2, size_t num)
{
void* ret = arr1;
if (arr1 <= arr2)
{
while (num--)
{
*(char*)arr1 = *(char*)arr2;
((char*)arr1)++;
((char*)arr2)++;
}
}
else
{
while (num--)
{
*((char*)arr1 + num) = *((char*)arr2 + num);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 4, arr + 2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]); //1 2 3 4 3 4 5 6 7 10
}
return 0;
}
//int memcmp(const void* ptr1, const void* ptr2, size_t num) 注意:这里的num单位是字节
//memcmp是比较从ptr1和ptr2指针开始的前num个字节
//memcmp和strcmp的区别是可以对任意类型的数据进行比较,其他无异
int main()
{
char arr1[] = "abcddef";
char arr2[] = "abcdefg";
int p1 = memcmp(arr1, arr2, 4);
int p2 = memcmp(arr1, arr2, 5);
printf("%d\n", p1); //0
printf("%d\n", p2); //-1
return 0;
}
//void* memset(void* ptr, int value, size_t num)
//memset是将ptr指向的内容的前num个字节的值设置成value 注意:num单位是字节 memset的返回值是ptr
int main()
{
char str[] = "hello world";
int arr[10] = { 0 };
memset(str, 'a', 5);
memset(arr, 1, 10);
printf("%s\n", str); //aaaaa world
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]); //16843009 16843009 257 0 0 0 0 0 0 0
//memset不能实现将arr的所有元素设置成1,主要原因还是memset中的参数num的单位是字节,它是按字节来设置的
}
return 0;
}