1.mecpy
void * memcpy ( void * destination, const void * source, size_t num );
功能:
- 对内存块进行拷贝,不关注内存里村的是啥,也就是说不只能拷贝字符了。
- 从source位置开始,复制num个字节的数据到destination指向的内存的位置。
- 如果源空间和目标空间有重叠,复制结果未定义(va中进行优化,可以实现复制操作)。
- 头文件<string.h>
拷贝完成后返回的是目标空间起始地址
例子:
#include <stdio.h>
#include <string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
模拟:
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
while (count--) {
*(char *)dst = *(char *)src;//强制类型转换时临时的
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
2.memmove
void * memmove ( void * destination, const void * source, size_t num );
功能:
memmove函数也是完成内存块拷⻉的
和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
memmove的使⽤需要包含<string.h>
拷贝完成后返回的是 目标空间起始地址
例子:
#include <stdio.h>
#include <string.h>
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]);
}
return 0;
}
模拟:
void * memmove ( void * dst, const void * src, size_t count) 1
{
void * ret = dst;//记录目标空间地址,最后返回
if (dst <= src || (char *)dst >= ((char *)src + count)) //另一种分界方式为dst<src为一种情况,剩下的为一种情况。
{
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}//正向拷贝
else
{
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}//逆向拷贝。
}
return(ret);
}
3.memset
void * memset ( void * ptr, int value, size_t num );
功能:
- memset 函数是⽤来设置内存块的内容的,将内存中指定⻓度的空间设置为特定的内容(不需要源空间提供内容,更加灵活)。
- <string.h>
注意:
-
函数将会把 value 值转换成 unsigned char 的数据进⾏设置,也就是说以字节为单位来设置内存块。
-
例子:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "hello world";
memset (str,'x',6);
printf(str);
return 0;
}
4.memcmp
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:
⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节.
比较的时候,内存中的内容被转化成unsigned char来比较
比较结果 >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' ⼤于 '%s'.\n", buffer1, buffer2);
else if (n < 0)
printf("'%s' ⼩于 '%s'.\n", buffer1, buffer2);
else
printf("'%s' 和 '%s' ⼀样.\n", buffer1, buffer2);
return 0;
}