#include
#include
#include
void * my_memmove(void *x,const void *y,size_t num) //定义函数为void * ,返回拷贝之后内存的地址
{
void *z=y; // 存储下y的地址,返回时用到
assert(x && y); // 断言 检测合法性(是否为空指针)
if(x
while(num--)
{
*((char *)x)++=*((char *)y)++; //强制转换成char *型,单个字节拷贝
}
}
else if(x==y)
{
return z;
}
else
{
while(num--)
{
*((char *)x+num)=*((char *)y+num);
}
}
//或者
return z;
}
int main()
{
int i=0;
void *p=NULL;
int a[]={1,2,3,4,5,6,7,8,9};
// int b[]={0};
p=my_memmove(a+2,a,20);//将a的前五个数拷贝进b,返回地址用p接收
for(i=0;i<9;i++)
{
printf("%5d",*(((int *)p)++)); //将p强制转换成int * 再 ++
}
printf("n");
return 0;
}
------------------------------------
朋友问我为什么移动19个字节而不是20个:
1在内存中的存储方式[01] [00] [00] [00]
(.代表指针所在位置) 如果移动20个字节 [ ][ ][ ][ ]. 指针指向下一个元素,操纵的下一个元素的首地址首字节,改变的是下一个元素。
如果移动19个字节 [ ][ ][ ].[ ] 指针指向本元素,操纵的本元素的最后一个字节,改变本元素,指针继续往前走就可以把本元素的所有字节都改变。



