对内存进行操作的函数:
memcpy函数:
和strcpy一样的 也是拷贝 只不过是对内存进行操作
前面的参数与strcpy是一样的 只不过最后那个参数是要拷贝的字节数
#include <stdio.h> int main() { char arr[]={1,2,3,4,5,6,7,8,9}; char arr1[6]={0}; memcpy(arr1,arr,5*sizeof(arr[0])); arr1的结果1,2,3,4,5,0 }
#include <stdio.h> #include <assert.h> void* my_memcpy(void* rest,const void* tmp,int num) { assert(rest && tmp); void* ret = rest; while (num--) { *(char*)rest = *(char*)tmp; (char*)rest += 1; (char*)tmp += 1; } return ret; } int main() { char arr[] = "sddfg"; char arr1[] = "xxxxxxxxxxx"; //memcpy(arr, arr1,2); my_memcpy(arr1, arr,7); printf("%s", arr1); }
对于内存重叠 最好使用memmove
c语言只要求:
memcpy能拷贝不重叠的内存空间就可以了
memmove去处理那些重叠内存拷贝
但 vs发现memcpy也能实现重叠拷贝
具体内存重叠是什么情况内 #include <stdio.h> int main() { int arr[]={1,2,3,4,5,6,7,8,9}; 像上面模拟实现memcpy的写法 在内存重叠时是这样的 my_memcpy(arr+2,arr,5*sizeof(arr[0])); }
你想把 1,2,3,4,5 放到2后面 理想的结果是1,2,1,2,3,4,5,8,9
但是实际上呢 是这样的1,2,1,2,1,2,1,8,9
因为当我们在放第三个的时候 那个地方的3已经被之前的赋值改成了1了 用已经改变了的值赋值肯定是不可以的
所以memmove就出现了
memmove函数:
这是一个我们实现memmove函数的思路
注意 我们的memmove函数的第一个参数是被考入的空间 第二个是考入的地址空间 第三个是 考入数据的字节数
#include <stdio.h> #include <assert.h> void* my_memmove(void* pc,const void* pc1,int num) { assert(pc&&pc1); void* ret = pc; if (pc < pc1)//由前往后 { int k = 0; while (k < num) { *((char*)pc + k) = *((char*)pc1 + k); k++; } } else//由后往前 { while (num--) { *((char*)pc + num) = *((char*)pc1 + num); } } return ret; } int main() { char ch[] = "abcdefgh"; printf("%s",(char*)my_memmove(ch, ch+2, 4)); }
因为是对内存进行操作 我们也不知道传进来的会是什么类型 所以这个函数的参数是 void 类型的 所以我们在操作的时候 把他们用一个一个字节来拷贝
memcmp函数:
同样这个是对内存进行比较的函数
memset函数:
这个是对内存进行一个赋值的函数
#include <stdio.h> int main() { char arr[3][3]; memset(arr,' ',sizeof(arr)); 这样整个数组都是 ' ' }
这样 对内存操作的函数就说完了 祝大家都能收到自己心仪大厂的offer