一.memcpy
1.功能
拷贝内存块,将字节数的值从源指向的位置直接复制到目标指向的内存块。
2.库函数定义
3.实例
代码语言:javascript
复制
/* memcpy example */
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main ()
{
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, strlen(myname)+1 );
person.age = 46;
/* using memcpy to copy structure: */
memcpy ( &person_copy, &person, sizeof(person) );
printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
return 0;
}
4.模拟实现
我们仿照库函数的定义来设计参数和返回值;因为参数的类型是 void * ,所以不能直接解引用,和 qsort 函数那里一样,我们采用强制类型转换成 char * ,然后解引用;
qsort函数:http://t.csdn.cn/iLwjY
具体代码:
代码语言:javascript
复制
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
//*((char*)dest)++ = *((char*)src)++; //这种写法并不是所有编译器都行的
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
C 语言定义中, memcpy ,只需要拷贝不重叠的部分,但在 vs 编译器中,memcpy 也能拷贝重叠的部分,功能和 memmove 类似了;
二.memmove
1.功能
移动内存块,将字节数的值从源指向的位置复制到目标指向的内存块。
2.库函数定义
3.实例
代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}
4.模拟实现
请看下图:
具体代码:
代码语言:javascript
复制
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
if (dest > src)
{
//从后往前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
else if (dest < src)
{
//从前往后
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
return ret;
}
三.memcmp
1.功能
比较两个内存块;
2.库函数定义
3.实例
代码语言:javascript
复制
#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' is greater than '%s'.\n",buffer1,buffer2);
else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);
return 0;
}
运行结果:
以上的内存函数都定义在头文件 <string.h> 中;