提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
在c语言的学习过程中,我们将不可避免的遇到内存函数,今天就让我们来学习一下内存函数的应用!!!
提示:以下是本篇文章正文内容,下面案例可供参考
内存函数是通过访问地址的方式操作对象(不必担心地址所对应的数据类型)可应用于任何类型的对象。
void * memcpy ( void * destination, const void * source, size_t num );
- 函数memcpy从指针source开始往下拷贝num个字节的数据到destination所对应的空间
- 此函数在遇到‘\0’是不会停下,仍会自动拷贝
- 如果source和destination有所重叠,那么复制的结果都是未定义的
- memcpy函数的传参对象都是void类型,因此可以拷贝任意数据类型
思路:
- 传递的执政不为NULL,所以用assert控制
- 因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为 char*类型
- arr2的值会变化,所以要将其开始的值赋值给一个void*类型的变量,最后返回它
- #include<stdio.h>
- #include<assert.h>
- void* my_memcpy(void* arr2, const void* arr1,size_t num)
- {
- assert(arr2 && arr1);
- void* p = arr2;
- while (num--)
- {
- *(char*)arr2 = *(char*)arr1;
- arr2 = (char*)arr2 + 1;
- arr1 = (char*)arr1 + 1;
- }
- return p;
- }
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
思路:
- 传递的执政不为NULL,所以用assert控制
- 因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为 char*类型
- 分类讨论,视情况而定,要用到分支语句。
- void* my_memmove(void* arr2, const void* arr1, size_t num)
- {
- assert(arr1 && arr2);
- void* p = arr2;
- if (arr2 < arr1)
- {
- while (num--)
- {
- *((char*)arr2 + num) = *((char*)arr1 + num);
- }
- }
- else
- {
- assert(arr2 && arr1);
- void* p = arr2;
- while (num--)
- {
- *(char*)arr2 = *(char*)arr1;
- arr2 = (char*)arr2 + 1;
- arr1 = (char*)arr1 + 1;
- }
- }
- return p;
- }
void *memset(void *ptr, int value, size_t n);
ptr:指向要填充的内存块的指针。
value:要设置的值。该值以 int 形式传递,但该函数使用此值的无符号 char 转换来填充内存块
size_t:字节数,无符号整型。
与strcpy的区别是:strcpy是复制,而memset是替换!!!
思路:传递的执政不为NULL,所以用assert控制
因为不确定传递的指针个数,所以最稳妥的方法就是一个个传递,所以需要强制转化为 char*类型
- #include
- #include
-
- void* my_memset(void* ptr, int value, size_t num)
- {
- assert(ptr);
- void* p = ptr;
- while (num--)
- {
- *((char*)ptr) = (char) value;
- ptr = (char*)ptr + 1;
- }
- }
内存函数的简单介绍!!!以及memcpy,memset,memmove的区别以及模拟实现