大家好!上期文章和大家分享了C语言字符函数和字符串函数有关知识。接下来我们再来了解一下C语言里的内存函数,记得三连支持一下哦!
一、memcpy使⽤和模拟实现
memcpy也是一个拷贝函数,与strcpy不同的是它可以拷贝不同的数据,如:整型、浮点型、字符型、结构体等等,并且它也可以指定拷贝多少数据,只不过memcpy指定的大小是字节,所以我们在拷贝数据的时候要乘以数据类型的大小。在使用时我们要注意:
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置;
2.这个函数在遇到 '\0' 的时候并不会停下来;
3.如果source和destination有任何的重叠,复制的结果都是未定义的;4.使用时要包含头文件<string.h>.
如:
下面我们来模拟实现一下:
我们可以看到memcpy函数的返回类型和前两个参数都是void*类型,这就是为了使这个函数什么类型的数据都能拷贝,并且是通过指针来拷贝。由于事先我们不知道要拷贝什么类型的数据,所以我们将两个参数强制转换成char*类型一个字节一个字节的拷贝(char*大小就是一个字节)这样就可以实现任何类型数据都可以拷贝了。
我们再深入思考一下,既然函数参数是指针,那么它能不能拷贝前面的数据放在后面呢?我们可以来测试一下:
我们可以看到结果是:1 2 1 2 1 2 1 8 9 10。
结果并不对,正确的应该是:1 2 1 2 3 4 5 8 9 10。这是为什么呢?
这是因为C语言中规定memcpy拷贝内存不重叠的数据
那么我们下面就来介绍可以实现重叠内存拷贝的函数——memmove.
二、memmove使⽤和模拟实现
memmove函数和memcpy函数相似,但是它拷贝的是重叠的内存。
如:
我们可以看到memmove函数可以实现重叠内存的拷贝。
如何模拟实现呢?我们先来分析一下:
来看代码:
下面分析一下代码:
在这里我们要了解一下:
memcpy是拷贝内存不重叠的数据的函数
memmove是拷贝内存重叠的数据的函数,当然也可以拷贝内存不重叠的数据。
但是在vs2022上memcpy也可以拷贝内存重叠的数据。
三、memset函数的使⽤
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
如:
四、memcmp函数的使⽤
memcmp是内存比较函数,从两个指针指向的位置开始,比较后面num个字节的地址。
返回值:
如:
好了,以上就是本篇文章的全部内容了,感谢大家的观看,如有错误感谢指正!创作不易,记得三连支持一下哦!