这一节主要讨论是:memcpy函数的使用以及模拟实现。memmove函数的使用以及模拟实现。memset函数的使用。memcmp函数的使用
内存函数,操作的是内存,memcpy函数是将一处指定地址处向后的指定的大小空间内的数据拷贝到另一处空间之中。这里需要注意的是两点:内存函数在拷贝过程中遇到\0不会中止拷贝。\0在这里与其他数据没有什么不同。另外一点就是memcpy在标准规定中不能进行重叠内存的拷贝。假如源数据空间与目的地空间重叠的话,我们就不能使用memcpy函数。c语言标准中规定当要进行重叠内存的拷贝时要使用memmove函数。但是在vs2022上面,memcpy是可以进行重叠内存的memcpy函数的定义是这样的:void* memcpy (void* destnation, const void* source, size_t num);内存函数需要对任意类型的数据进行拷贝,所以传递参数时,形参指针接收的是void类型的地址。同时返回的也是void类型的指针。
使用案例:?
模拟实现:?
?memmove作用是对重叠的内存空间空间进行拷贝。c语言标准规定,memcpy进行非重叠的内存数据的拷贝,而memmove进行重叠的内存空间的拷贝。那么,为何会有这种划分呢?
原因是因为内存如果重叠,那么再进行拷贝过程中可能发生冲突。具体原因如下?
从上面可以得到一个结论,就是假如destnation的首地址大于source的首地址,那么就从后向前拷贝,反之。
接下来是模拟实现:
memset主要用来数据的初始化。其定义为:
void* memset(void* ptr, int value, size_t num);
下面为运用案例:?
?
memcmp和strncmp比较的方式类似,只是比较的元素变成了以字节为单位,比较的是内存中的数据。而不是以一个字符为单位,比较字符。其定义是:int memcmp(const void* str1, const void* str2, size_t num);str1指向第一块内存首地址。strt2指向第二块内存首地址,num则表示str1,与str2的前num字节的内存进行比较。要注意的是,当比较时遇到\0不会中止比较。\0在这里与其他数据并无区别。当str1 指向空间大于 str2时,返回大于0的数字。当str1 指向空间小于str2时,返回小于0的数字。相等则为0.
下面为运用案例: