徐州学习网站建设,最新h5优秀作品欣赏,谁会在掏宝网上做网站,外汇网站怎么做优外汇网站#x1f495;痛苦难以避免#xff0c;而磨难可以选择。--村上春树#x1f495; 作者#xff1a;Mylvzi 文章主要内容#xff1a;数据在内存中的存储 内存函数就是管理内存数据的函数#xff0c;包含于头文件string.h中 1.memcpy函数--内存… 痛苦难以避免而磨难可以选择。--村上春树 作者Mylvzi 文章主要内容数据在内存中的存储 内存函数就是管理内存数据的函数包含于头文件string.h中 1.memcpy函数--内存复制函数处理不重叠内存的拷贝 作用将src中前num个字节拷贝到dest中并返回dest的地址(和strcpy函数类似) 注意传递的函数指针不确定所以使用void*(通用指针类型) 对于void*有四个方面需要注意 1.不能直接解引用必须进行强制类型转换 2.不能进行指针运算 3.可以进行指针之间的比大小操作 4.强制类型转换只是一种临时转换并不会改变原先的数据类型 实例1 实例2 模拟实现memcpy函数
//代码模拟实现my_memcp函数
void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest src);//断言void* ret dest;//使用ret指针记录dest指针的起始位置while (num--){*(char*)dest *(char*)src;//强制类型转换为char*,便于一个字节一个字节交换dest(char*)dest1;src(char*)src1;}return ret;
}
int main()
{int arr1[] { 1,2,3,4,5 };//数组的大小为20byteint arr2[10] { 0 };my_memcpy(arr2, arr1, 20);//注意第三个参数size_num是以字节为单位的int i 0;for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
} 注意memcpy函数是处理不重叠内存的拷贝也就是不能是同一个数组不占用相同的一块内存否则在拷贝的过程中会把原有数据覆盖导致拷贝错误虽然在vs中却可以处理但是在其他编译器上未必支持 2.memmove函数--内存拷贝函数处理重叠内存的拷贝 模拟实现memmove函数重要
//2.memmove函数--void* memmove(void* dest ,const void* src, size_t num)
//处理内存重叠的内存之间的拷贝
//理解为将dest和src强行分离为两个独立的内存
//参数和memcpy相同//模拟实现memove函数
//基本逻辑是从src的某个位置开始将之后的num个字节的元素赋给dest;
//但可能出现src的元素未被拷贝之前就已经被覆盖在src和dest重合的部分
void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest src);//断言void* ret dest;//srcdest--从前往后拷贝if (src dest){while (num--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}}//srcdest--从后往前拷贝包括src和dest不交叉的情况else{while (num--){*((char*)dest num) *((char*)src num);dest (char*)dest 1;src (char*)src 1;}}return ret;
}
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1, arr12, 20);int i 0; for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
}
画图模拟 3.memcmp--内存比较函数 比较两个内存之间前num个字节的大小关系 ptr1ptr2--返回大于0的数字 ptr1ptr2--返回小于0的数字 ptr1ptr2--返回0 实例1 4.memset--内存设置函数 将ptr中前num个字节的元素替换为设置的value; 实例1