目录
- 前言:
- 1.memcpy
- memcpy函数介绍
- memcpy函数的模拟实现
- 2.memmove
- memmove函数介绍
- memmove函数的模拟实现
- 3.memcmp
- 4.memset
前言:
紧接字符串函数,接下来介绍内存函数~~
————————————————————
1.memcpy
memcpy函数介绍
memcpy函数的作用是内存拷贝
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 ‘\0’ 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
memcpy函数的使用:
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 16);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
打印结果:
整型数值一个元素4个字节,传过去16个字节即打印arr1里面的前4个元素,其他补0(可以拷贝整型数组、字符串和结构体,因为void * 的指针可以接收任意数据)
memcpy函数的模拟实现
void* my_memcpy(void* dest, const void* str, size_t num)
{
assert(dest && str);
void* t = dest;
while (num--)
{
*(char*)dest = *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
return t;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 24);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
函数拷贝结束后,返回目标空间的起始地址
void * 可以接收任意数据类型,把它转换成char *,因为char类型的大小为1个字节,可以一个一个的接收某个数据类型(传过来的数据类型不确定),直到拷贝结束,返回目标空间的起始地址。
2.memmove
memmove函数介绍
memmove函数的参数与memcpy相同
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memmove函数的使用:
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);//1 2 1 2 3 4 5 8 9 10
}
return 0;
}
memmove函数可以拷贝重叠的数组,从arr1第三个元素的地址开始拷贝,拷贝的数据从arr1首元素开始,拷贝的个数为6个,最后打印10个元素。
如果改成:
memmove(arr1, arr1 + 2, 20);.//3 4 5 6 7 6 7 8 9 10
就是从arr1的首元素地址开始拷贝,拷贝的数据从arr1的第三个元素开始,拷贝的个数为6个,最后打印10个元素。
memmove函数的模拟实现
void* my_memmove(void* dest, const void* str, size_t num)
{
assert(dest && str);
void* t = dest;
if (dest < str)
{
while (num--)
{
*(char*)dest = *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)str + num);
}
}
return t;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1 + 2, arr1, 20);//从后向前拷贝
//my_memmove(arr1, arr1 + 2, 20);//从前向后拷贝
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
重叠拷贝有两种情况:(防止拷贝的元素有重叠)
1.从前向后拷贝;
2.从后向前拷贝。
如果dest<str,从前向后拷贝;反之,则从后向前拷贝。
3.memcmp
memcmp函数的作用是内存比较
比较从ptr1和ptr2指针开始的num个字节
返回值如下:
比较的字节相同,返回0;
比较的字节ptr1大于ptr2,返回>0;
比较的字节ptr1小于ptr2,返回<0;
memcmp函数的使用:
int main()
{
int arr1[] = { 1,2,1,4,5,6 };
int arr2[] = { 1,2,257 };
int len = memcmp(arr1, arr2, 9);
printf("%d\n", len);
return 0;
}
返回的结果是0,它是一个字节一个字节比较的
4.memset
memset函数的作用是把ptr指向的前num个字节的内容设置成value的值(把value的值以字节为单位一个一个放到ptr里)
memset函数的使用:
int main()
{
char arr[] = "abcdefgh";
memset(arr + 2, 'y', 3);
printf("%s\n", arr);
return 0;
}
打印结果:
arr+2:指向arr的第三个元素,从这开始设置要设置的值;
‘y’:要设置的值;
3:设置3个,从字符c开始把cde设置为字符y
感谢观看~~