目录
一、memcpy
使用
1.将arr1拷贝5*sizeof(int)个数据到arr2
2.不关心\0,只关心num。
num为多少就拷贝多少。
3.拷贝内存不重叠
void * memcpy ( void * destination, const void * source, size_t num );
实现
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
模拟实现
//memcpy拷贝任意类型
void* my_memcpy(void* dest, const void* src,size_t num)
{
//因为为void*不能使用,需要强制类型转换为char* , 一个一个拷贝,便于适用num
while (num--)//num -- 4 , 3 , 2 , 1 ,0 就不进来了
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1; // dest++ src++
src = (char*)src + 1;
}
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 5 * sizeof(int));
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
二、memmove
模拟实现
分析
当dest在src右边的时候,倒着拷贝。
当dest在src左边的时候,正着拷贝
联合分析
那如何从后->前拷贝呢?
一个字节是8bite,如图
src是首元素地址,强制类型转换为char*,然后再加上num,到达了src的空间末尾。
dest也是一样,到达dest的空间末尾。
然后一个一个的呼唤。
代码实现
//memmove模拟实现
//与memcpy相比,memove的内容可重叠。
void* my_memmove(void* dest,void* src,size_t num)
{
void* ret = dest; //保存起始地址
if (dest < src)//dest在左边,从前-->后
{
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else//从后-->前
{
while (num--)//num-- 进来就是19,src是首元素地址+19就到了末尾空间位置,赋值到dest的末尾空间,然后19再--,到了18 17 16 15...
{
*((char*)dest+num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2, arr1, 5 * sizeof(int));//希望打印:1 2 1 2 3 4 5 8 9 10,结果是错误的。
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
三、memset
内存设置成你想设置的内容
使用
int main()
{
char arr[10] = "hello bit";
memset(arr, 'x', 5);
//memset在设置的时候是以字节为单位来设置的
printf("%s ", arr);
return 0;
}
需要注意的是
memset在设置的时候是以字节为单位来设置的
来看一个错误的例子
int main()
{
int arr[10] = { 0 };
memset(arr, 1, 40);
return 0;
}
四、memcmp
内存比较
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
>0返回>0的数字,
=0返回0,
<0返回<0的数字
#include <stdio.h>
#include <string.h>
int main()
{
char buffer1[] = "DWgaOtP12df0";
char buffer2[] = "DWGAOTP12DF0";
int n;
n = memcmp(buffer1, buffer2, sizeof(buffer1));
if (n > 0)
printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' is less than '%s'.\n", buffer1, buffer2);
else
printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
return 0;
}
完