头文件:string.h
1.11 memcpy
void * memcpy ( void * destination , const void * source , size_t num ); //内存函数,牵扯到调用内存的字节数,所以带上num。
函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置。
这个函数在遇到 '\0' 的时候并 不 会停下来。
如果 source 和 destination 有任何的重叠(比如:arr 和 arr + 2),复制的结果都是未定义的。
Return Value
memcpy returns the value of dest(修改后的dest).
复制失败,函数将返回一个空指针(NULL)。
返回的是首字节的地址,需要强制类型转化 (void * memcpy)
void* 不能进行 ++ 操作,因为 void* 是一个指向未知类型的指针类型,它的大小是不确定的。
而 ++ 操作需要知道指针所指向的对象的大小,才能正确地进行指针运算。
void* my_memcpy(void* dest, const void* src, size_t sz)
{
//void*指针不能解引用 也不能++ --
assert(dest && src);
void* ret = dest; //需要返回初始地址时,在地址修改之前,先用一个额外的指针,记住这个其实指针。
while (sz--) //一次拷贝一个字节,sz-- sz=0时候停止
{
*(char*)dest = *(char*)src; //按字节拷
dest = (char*)dest + 1; //强制类型转换,只会转换该处的类型 dest存放的是转化后的地址
src = (char*)src + 1;
}
return ret; //不能返回dest,因为dest的位置已经被修改了,需要返回一个出位置
}
//memcpy 负责拷贝两块独立空间arr1 arr2 中的数据
//重叠内存 arr arr+2 的拷贝,是怎么做的呢?memmove
1.12 memmove
memcpy函数是不用来处理重叠的内存之间的数据拷贝的
使用memmove函数来实现,重叠内存之间的数据拷贝(memmove的功能大于memcpy)
void* memmove(void* destination, const void* source, size_t num);
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
Return Value
memmove returns the value of des t.
内存块重叠:(重叠)
有时候需要从前往后处理数据
有时候需要从后往前处理数据
不好辨别,画一画看看(原则:将未修改过的src指向的内容,原原本本地拷贝给dest指向的空间。)
src在不断移动,所以src对应的数据满足const修饰
当dest的起点在src的起点前边 即dest<src 从前向后考 (指针可以进行大小比较,比较的是地址的高低 )
从后往前拷:
当dest在src后边,即dest>src,从后往前考
1.13 memcmp:比较两块内存里的!数据!是否相同
比较从ptr1和ptr2指针开始的num个字节
int memcmp ( const void * ptr1,
const void * ptr2,
size_t num );
Return Value Relationship of First count Bytes of buf1 and buf2 //按照字节比较
< 0 buf1 less than buf2
0 buf1 identical to buf2
> 0 buf1 greater than buf2
1.14 memset--memory set 内存设置:
对内存中的数据去进行修改、初始化(按照!!每个字节!!进行操作)
void *memset( void *dest, int c, size_t count );
Return Value
memset returns the value of dest.
举例:
char arr[] = "hello bit";
memset(arr+1, 'x', 4); //从传进去的 dest的位置 开始修改 ,字符用单引号,字节数为4