网站页面设计主要包括,资源猫,昆明网站seo优化,wordpress怎么登陆后台strcpy拷贝的仅仅是字符串#xff0c;但是内存中的数据不仅仅是字符#xff0c;所以就有了memcpy函数
1. memcpy void *memcpy #xff08;void * destination #xff0c;const void * source , size_t num) 函数memcpy从source的位置开始向后拷贝num个字节的数据到desti… strcpy拷贝的仅仅是字符串但是内存中的数据不仅仅是字符所以就有了memcpy函数
1. memcpy void *memcpy void * destination const void * source , size_t num) 函数memcpy从source的位置开始向后拷贝num个字节的数据到destination的内存位置
#includestring.h
int main()
{int arr1[10] { 0 };int arr2[] { 1,2,3,4,5 };//把arr2中的前5个整形的数据拷贝放到arr1中memcpy(arr1, arr2, 20);return 0;
}
可以看到前5个整形都拷贝过来了 memcpy函数的模拟实现 1一个字节一个字节的拷贝destsrc转为char * eg如果拷贝7个字节两个int *类型指针不能操作 2char *dest不能这样写因为的优先级高于强制类型转换 相当于先对原类型进行再进行进行强转 前置char *)dest虽然C语言中可以但是改为c就不能运行所以还是正常写1 #includestring.h
#includeassert.h
void* my_memcpy(void* dest, const void* src, size_t sz)
{void * retdest;assert(dest src);while (sz--){*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}return ret;
} 一个数组arr{12345678910}如果想在自身的基础上进行拷贝即把12345拷贝到34567的位置上想得到结果12123458910
但是得到的结果却是1 2 1 2 1 2 1 8 9 10 我们就发现不重叠内存的拷贝可以使用memcpy 重叠内存的拷贝使用memmove函数 上面其实是标准规定但是实际在VS2022这个环境中memcpy也能实现重叠内存的拷贝
其他平台不一定
#includestdio.h
#includestring.h
#includeassert.h
void* my_memcpy(void* dest, const void* src, size_t sz)
{assert(dest src);while (sz--){*(char*)dest *(char*)src;dest (char*)dest 1;//这里不能写成char*dest强制类型转化是临时的的时候dest并不一定是char*类型的src (char*)src 1;}
}
int main()
{int arr[] { 1,2,3,4,5,6,7,8,9,10 };my_memcpy(arr 2, arr, 20);for (int i 0; i 10; i){printf(%d , arr[i]);}return 0;
} 2. memmove void *memmovevoid * destination const void * source , size_t num) 参数和memcpy一样但是memmove可以实现重叠内存的拷贝 memmove函数的模拟实现
这里不考虑直接开辟一个相同的空间再进行拷贝元素
讨论 destsrc:只能从前向后拷贝 destsrc:只能从后向前拷贝 dest和src不相干的时候从后往前或者从前往后都可以 #includestdio.h
#includeassert.h
void* my_memmove(void* dest, const void* src, size_t sz)
{void* ret dest;assert(dest src);if (dest src){//前-后while (sz--){*(char*)dest *(char*)src;dest (char*)dest1;src (char*)src1;}}else{//后-前while (sz--){*((char*)dest sz) *((char*)src sz);}}return ret;
}
int main()
{int arr[20] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr , arr2, 20);for (int i 0; i 10; i){printf(%d , arr[i]);}return 0;
} 3. memcmp int memcmp ( const void * ptr1,const void *( ptr2 , size_t num ) 类似strcmp函数memcmp是一对字节一对字节进行比较比较num个字节ACSII值
1返回值
如果返回值 0则表示 str1 小于 str2如果返回值 0则表示 str1 大于 str2如果返回值 0则表示 str1 等于 str2
#includestdio.h
#includestring.h
int main()
{int arr1[] { 1,2,3,4,5,6,7 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 07 00 00 00int arr2[] { 1,2,3,0x11223304 };//01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11 int ret memcmp(arr1, arr2, 13);printf(%d\n, ret);
}
上面这个代码虽然arr1的元素多但是比较前13个字节的大小都一样那么ret0 4. memset void *memset( void *dest, int c, size_t count ) 复制字符c一个无符号字符到参数str所指向的字符串的前n个字符
初始化前count个字节为c
是以字节为单位设置内存的
eg1:将hello world中的wor改为xxx
#includestdio.h
#includestring.h
int main()
{char arr[] hell0 world;memset(arr 6, x, 3);printf(%s\n, arr);return 0;
}
eg2 思考这个代码将arr改为了啥
#includestdio.h
#includestring.h
int main()
{int arr[10] { 0 };memset(arr, 1, 40);return 0;
} 每一个int类型的元素的每一个字节都改为了1 所以想把数组每一个元素都初始化为1用memset函数是不可能实现的 但是可以都初始化为0 本次内容就到此啦欢迎评论区或者私信交流觉得笔者写的还可以或者自己有些许收获的麻烦铁汁们动动小手给俺来个一键三连万分感谢 !