宝安做棋牌网站建设哪家公司便宜,jsp网站搭建,sem网站建设,wordpress构建小程序之前我们讲过一些字符串函数#xff08;http://t.csdnimg.cn/ZcvCo#xff09;#xff0c;今天我们来讲一讲几个内存函数#xff0c;那么可能有人要问了#xff0c;都有字符串函数了#xff0c;怎么又来个内存函数#xff0c;这不是一样的么#xff1f;
我们要知道之前…
之前我们讲过一些字符串函数http://t.csdnimg.cn/ZcvCo今天我们来讲一讲几个内存函数那么可能有人要问了都有字符串函数了怎么又来个内存函数这不是一样的么
我们要知道之前的字符串函数只能对字符串进行一系列操作很是局限这次的内存函数就不一样了内存函数的范围就很广了它可以对数组啊或者是结构体进行操作了。 memcpy函数 它是一个内存拷贝函数类似于字符串函数strcpy。 memcpy的头文件是string.h int main() {int arr1[10] { 0 };int arr2[] { 1,2,3,4,5 };memcpy(arr1, arr2, 20 );return 0;
} 1、上面的例子就是两个数组传的也是整形所以就不能用strcpy所以就体现了memcpy的重要性和通用性。 2、这个num一定要注意是字节的大小所以上面的例子传了5个整数int所以字节大小就是20。 那么我们该如何对他进行模拟实现呢 void* my_memcpy(void* dest,void* src,size_t sz) {assert(dest src);void* ret destwhile (sz--) {*(char*)dest *(char*)src;dest (char*)dest1;src (char*)src 1;}return ret;
}int main() {int arr1[10] { 0 };int arr2[] { 1,2,3,4,5 };my_memcpy(arr1, arr2, 20 );return 0;
} 这里我们进行了一个模拟实现 1、首先我们因为要考虑传的参数都可能不同所以为了通用性我们这里用void*来接受各种类型的指针。 2、其次当进行拷贝的时候由于是一个字节一个字节进行的所以我们只能转换成char*来进行交换。 3、交换完之后我们还需要将dest和src进行后移移动到下一个字节待交换因为强制类型转换是临时性的所以这里在进行移动的时候还需要进行一次强制类型转换。 4、sz是总字节大小所以用做循环的变量来控制循环。 memmove函数 刚刚的memcpy函数是用来进行两个之间的拷贝那么这个memove函数是用来进行同一个内存块的拷贝。 int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };memmove(arr2, arr, 12 );return 0;
} 思考memmove的模拟实现 但是这个思路到底能否实现呢 那么只是用从后向前拷贝就可以解决所有问题么 所以这个我们就要进行分类讨论了 可以看到上面这个图我们可以看到最后通过我们的分析可以知道我们当destsrc时要进行从前向后拷贝destsrc时要进行从后向前拷贝。 那么我们来实现一下代码 void* my_memmove(void* dest, void* src, size_t sz) {assert(dest src);void* ret dest;while (sz--) {if (dest src) {*(char*)dest *(char*)src;dest (char*)dest 1;src (char*)src 1;}else {*((char*)dest sz) *((char*)src sz);}}return ret;
}
int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr2, arr, 12 );return 0;
} 我们用while循环sz为循环变量当destsrc的时候我们就将其正常拷贝就可以了 否则的话我们用dest和src分别加sz就到了数组的后面然后随着sz的递减我们就实现了从后向前拷贝。 memset函数 这个函数可以将内存块进行指定更改例如 我们可以看到arr代表首元素地址所以从数组第一个1开始向后的12个字节也就是3个int整形所以我们看到内存里面的前三个被替换成了0。 另外也可以替换字符串 int main() {char arr[] { Hello world };memset(arr6 ,x, 3);printf(%s, arr);return 0;
} 我们可以替换字符串就像这样 但是当用这个函数的时候有一个点 int main() {int arr[] { 1,2,3,4,5,6 };memset(arr1 ,1, 8);return 0;
} 这个函数我们想要把23也都变成1但是我们运行结果却不是 我们发现并不是更改成了1当我们用16进制看的时候会发现 它是将每一个字节都更改成了1所以导致最后的值很大。 memcmp函数 可以看到由于memcmp是按照字节比较的所以当我们取前三个元素的字节时arr1和arr2都是一样的所以输出结果就是0。 但是当我改成 07比04大所以arr2大于arr1返回的是小于0的值。 感谢大家的观看我们下次再见