C语言从入门到进阶——第18讲:内存函数
文章目录1. memcpy2. memmove3. memset4. memcmp1. memcpy函数原型void*memcpy(void*destination,constvoid*source,size_tnum);功能memcpy是完成内存块拷贝的不关注内存中存放的数据是啥函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。如果source和destination有任何的重叠复制的结果都是未定义的。内存重叠的情况使用memmove就行memcpy的使用需要包含string.h参数destination指针指向目标空间拷贝的数据存放在这里source指针指向源空间要拷贝的数据从这里来num要拷贝的数据占据的字节数返回值拷贝完成后返回目标空间的起始地址代码演示#includestdio.h#includestring.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};intarr2[10]{0};memcpy(arr2,arr1,20);inti0;for(i0;i10;i){printf(%d ,arr2[i]);}return0;}模拟实现void*memcpy(void*dst,constvoid*src,size_tcount){void*retdst;assert(dst);assert(src);// copy from lower addresses to higher addresseswhile(count--){*(char*)dst*(char*)src;dst(char*)dst1;src(char*)src1;}return(ret);}2. memmove函数原型void*memmove(void*destination,constvoid*source,size_tnum);功能memmove函数也是完成内存块拷贝的和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。memmove的使用需要包含string.h参数destination指针指向目标空间拷贝的数据存放在这里source指针指向源空间要拷贝的数据从这里来num要拷贝的数据占据的字节数返回值拷贝完成后返回目标空间的起始地址代码演示#includestdio.h#includestring.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};memmove(arr12,arr1,20);inti0;for(i0;i10;i){printf(%d ,arr1[i]);}return0;}输出的结果1 1 2 3 4 5 6 7 8 9 10模拟实现void*memmove(void*dst,constvoid*src,size_tcount){void*retdst;if(dstsrc||(char*)dst((char*)srccount)){// Non-Overlapping Buffers// copy from lower addresses to higher addresseswhile(count--){*(char*)dst*(char*)src;dst(char*)dst1;src(char*)src1;}}else{// Overlapping Buffers// copy from higher addresses to lower addressesdst(char*)dstcount-1;src(char*)srccount-1;while(count--){*(char*)dst*(char*)src;dst(char*)dst-1;src(char*)src-1;}}return(ret);}3. memset函数原型void*memset(void*ptr,intvalue,size_tnum);功能memset函数是用来设置内存块的内容的将内存中指定长度的空间设置为特定的内容。memset的使用需要包含string.h参数ptr指针指向要设置的内存空间也就是存放了要设置的内存空间的起始地址。value要设置的值函数将会把value值转换成unsigned char的数据进行设置的。也就是以字节为单位来设置内存块的。num要设置的内存长度单位是字节。返回值返回的是要设置的内存空间的起始地址。代码演示#includestdio.h#includestring.hintmain(){charstr[]hello world;memset(str,x,6);printf(str);return0;}输出的结果xxxxxxworld总结当有一块内存空间需要设置内容的时候就可以使用memset函数值得注意的是memset函数对内存单元的设置是以字节为单位的。4. memcmp函数原型intmemcmp(constvoid*ptr1,constvoid*ptr2,size_tnum);功能比较指定的两块内存块的内容比较从ptr1和ptr2指针指向的位置开始向后的num个字节memcmp的使用需要包含string.h参数ptr1指针指向一块待比较的内存块ptr2指针指向另外一块待比较的内存块num指定的比较长度单位是字节返回值返回值含义0ptr1内存块数据大于ptr2以unsigned char值比较0ptr1与ptr2内存块数据相等0ptr1内存块数据小于ptr2以unsigned char值比较代码演示#includestdio.h#includestring.hintmain(){charbuffer1[]DWgaOtP12df0;charbuffer2[]DWGAOTP12DF0;intn;nmemcmp(buffer1,buffer2,sizeof(buffer1));if(n0)printf(%s 大于 %s.\n,buffer1,buffer2);elseif(n0)printf(%s 小于 %s.\n,buffer1,buffer2);elseprintf(%s 和 %s 一样.\n,buffer1,buffer2);return0;}总结如果要比较2块内存单元的数据的大小可以使用memcmp函数这个函数的特点就是可以指定比较长度。memcmp函数是通过返回值告知大小关系的。