#includememcpy实现过程 p1对p1开始赋值前p1数组元素情况 p1对p2开始赋值void* my_memcpy(void*copy, void*test, unsigned int num) //memcpy可以复制任意类型数(整形,字符串等) { int* p2 = (int*)copy; //强制转换 其中arr元素地址类型本就为 int* int* p1 = (int*)test; while (num != 0) { *p2++ = *p1++;//解引用赋值后地址再++; //若地址重叠 低位寻址可能会导致重叠问题导致原有区域被覆盖 num--; } return p1;//返回p1地址 上面已经通过寻址改变了arr的元素 ,这里p1地址就是arr首元素地址 } int main() { int arr[] = { 1,2,3,4,5,6,7,8 }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); my_memcpy(arr + 2, arr, 6); for (i = 0; i < sz; i++) { printf("%d ", arr[i]);//1 2 1 2 1 2 } return p2; }
这里 p2地址比p1高两位
低位开始寻址 再赋值给p2时 由于数组地址有重叠部分,低位赋值这造成p2较高位地址被覆盖
#includememmove实现过程 p1对p2开始赋值void* my_memmove(void*copy, void*test, unsigned int num) { int* p2 = (int*)copy; int* p1 = (int*)test; while (num != 0) { *(p2 + num - 1) = *(p1 + num - 1);//从高位进行寻址能有效避免从低位寻址所带来的重叠问题 num--; } return p2; } int main() { int arr[] = { 1,2,3,4,5,6,7,8, }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); my_memmove(arr + 2, arr, 6); for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
可以看见从高位寻址赋值不会覆盖低位,保证赋值的准确性
C语言初学者,如有不对,请多多指正。



