目录
学会使用内存操作函数memcpy、memmove、memcmp并自主实现
!!!!!!!注:建议与主页的字符串函数对比学习!!!!!!!
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始地址。注:该函数遇到‘\0’时并不会停下来,如果source和destination有任何的重叠,复制的结果都是未定义的。
它与之前的字符串函数strncpy的区别是字符串函数仅仅能操作字符串,而它能操作任意类型,因为它是在内存层面拷贝的。
它的实现原理与函数strncpy类似,但因为它可以操作任意类型所以指针类型为通用型指针void*,注意通用型指针不可以解引用和++、--操作,所以将其强类型转换。
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- void* my_memcpy(void* dest, const void* src, size_t num)
- {
- void*ret = dest; //记录目的空间的起始位置
- assert(dest&&src);
-
- while (num--)
- {
- *(char*)dest = *(char*)src;
- ++(char*)dest;
- ++(char*)src;
- }
- return ret;
- }
void * memmove ( void * destination, const void * source, size_t num );
它的功能与memcpy一样也是从source的位置开始向后复制num个字节的数据到destination的内存位置,返回目的空间的起始位置,但不一样的是它可以操作source和destination重叠的情况。如:1 2 3 4 5 6 7 将里面的1234复制到4 5 6 7的位置上。
分析:将1234复制到4567中时,如果先将1复制到4中会丢失了4,所以要从后面开始将4复制到7中再到3->6等等。那假如是4567复制到1234时,如果从后面开始的话7->4,那么4会丢失,所以要改为4复制到4中,5->3等等。所以实现时要分成两种情况。
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- void* my_memmove(void* dest, const void* src, size_t num)
- {
- void* ret = dest;
- assert(dest&&src);
- if (dest < src) //从前面复制到后面
- {
- while (num--)
- {
- *(char*)dest = *(char*)src;
- ++(char*)dest;
- ++(char*)src;
- }
- }
- else
- {
- while (num--)//从后面复制到前面
- {
- *((char*)dest + num) = *((char*)src + num);
- }
- }
- return ret;
- }
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
该函数比较从ptr1和ptr2指针开始的num个字节,与strncmp类似,返回值也相同。不同的是它在内存层面操作,可以操作任意类型。
实现与strccmp类似。
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- int my_memcmp(const void * ptr1, const void * ptr2, size_t num)
- {
- assert(ptr1&&ptr2);
- char* dest = (char*)ptr1;
- char* src = (char*)ptr2;
- //比较
- while (num && (*dest == *src))
- {
- dest++;
- src++;
- num--;
- }
- if (!num || ((*dest) && (*src))) //num个字符或者字符都比较完时
- {
- return 0;//完全相等时
- }
- return(*dest - *src);
- }
争取每次学习都能掉十根头发,不掉头发的程序员不是好程序员。
——Ace Young