目录
1.memcpy使用和模拟
1.1使用
void *memcpy (void *destination,const void * sourece,size_t num); 从souce的位置开始向后复制num个字节的数据到destiantion指向的内存地址 函数遇到\0不停止 如果source和destination有重叠,结果未知
这里要记住,num这个参数是字节数,而一个整型数占4个字节,所以只会复制5个数字过去
1.2模拟
#include<stdio.h> #include<assert.h> void* memcpy1(void* dest, const void* src, size_t count) 因为可能是不同类型的数据复制,所以用void类型 { void* ret = dest;//方便返回 assert(dest);//报错 assert(src); while (count--)//因为count就是要复制的个数,所以直接count--即可 { *(char*)dest = *(char*)src; 拷贝一个字节, 而char*类型只访问一个字节,所以这里要强制临时转换为char*类型 dest = (char*)dest + 1; src = (char*)src + 1; 这两条语句是为了向后走,注意强制转换类型,不然会跳未知的字节数 } return ret; }
2.memmove使用和模拟实现
2.1使用
void * memmove(void * destination,const void *source,size_t num); 与memcpy的区别是memmove可以处理源地址和目标地址是可以重叠的 如果有重叠,不能用memcpy,得用memmove 虽然有时候标准库的memcpy可以处理重叠现象,但是不是所有编译器都能 因为memcpy标准上没有要求处理重叠内容
2.2模拟
#include<stdio.h> void* memmove1(void* dest, const void* src,size_t count) { void* ret = dest; if (dest <= src || (char*)dest >= ((char*)src + count)) //两种情况下,要从前向后拷贝,目标起始大于等于源地址或者在源地址之后 { while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest + 1; src = (char*)src + 1; } } else //剩下情况都从后向前拷贝 { dest = (char*)dest + count - 1; src = (char*)src + count - 1; while (count--) { *(char*)dest = *(char*)src; dest = (char*)dest - 1; src = (char*)src - 1; } } return(ret); } int main() { int arr1[] = { 1,2,3,4,5,6,7,8,9,10 }; memmove1(arr1 + 2, arr1, 20); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr1[i]); } return 0; }
3.memset函数的使用
3.1使用
void * memeset(void * ptr,int value,size_t num); 设置内存,将内存中的值以字节为单位设置内容 不能改大于1个字节类型的数据
4.memcmp函数使用
4.1使用
int memcmp(const void * ptr1,const void * ptr2,size_t num); 比较从ptr1和ptr2指针指向的位置开始,向后的num个字节 返回值大于0,则ptr1>ptr2 返回值小于0,ptr1<ptr2 返回值等于0,ptr1=ptr2 由于是内存比较,所以int类型有时候可以有时候不行