在学习过程中,内存函数也是需要学习的东西,比如, memcpy memmove memset memcmp
关于memcpy函数, 它的第一个参数, void * destination 是代表需要复制内存的目的地,而 第二个参数, void *source代表被复制内存的 源头, 就是 将 第二个参数的内存复制到第一个参数里面, 而最后一个参数 size_t num,代表你要从“源头”地址往后复制几个字节, 就是从第一个参数复制 多少个字节到第二个参数里面。
我们可以看到 我们将第一个数组 arr1里面的 3,4,5,6,7,复制到数组arr2里面,所以我们在使用memcpy函数时,第一个参数我们填写 目的地的初始地址arr2,在写第二个参数时 我们填写被复制的参数的 源头 地址 因为我们要从3开始复制所以,将第一个数组arr1 +2就得到了 源头地址,最后一个参数,size_t.因为我们要复制五个整形,一个整形四个字节,五个整形就是20个字节,所以第三个参数就是 20; 而 memcpy 的返回类型就是 目的地的初始地址。
2.memmove
memove 在处理 内存重叠的时候可以使用, 一般情况下,内存不重叠 就是用memcpy进行复制拷贝,而内存重叠我们就可以交给memcpy。
关于内存重叠就比如以下情况:
当我们使用 memcpy函数 想要将 arr1 数组的,前五位 1 2 3 4 5;放在第三位开始,就是 替换 3 4 5 6 7的位置,最后变成,1 2 1 2 3 4 5 8 9 10,可是结果真的如此吗?
可是真实结果会出乎我们的意料
为什么会有这样的结果呢?
就是因为,当要开始将 1 2 3 4 5复制到 3 4 5 6 7时,内存重叠了,将3的位置拷贝成1,4的位置拷贝成2的时候,5 原本应该拷贝3过去,可是这里的3已经变成了1,所以把1拷贝了过去,以此类推就达不到我们想要的效果,就变成了 1 2 1 2 1 2 1 8 9 10.
所以,此时我们可以使用 memmove 函数
memmove函数,第一个参数也是 需要复制到的目的地, 第二个参数还是 被复制的 源头地址,第三个参数就是 你要往后复制多少个字节。
这里,我们使用memmove函数就达到了我们想要的效果,它的返回类型 是返回目的地的地址,相比 memcpy,memmove可以处理内存重叠的情况,在大部分情况下我们可以直接使用memmove函数就行, 一般情况下 使用 memcpy函数,当内存重叠时我们可以交给memmove函数。
memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
3.memset
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
memset第一个参数,指向需要设置的地址,第二个参数,是你要设置的值。该值以int形式传递,但函数使用此值的unsigned char转换填充内存块,第三个参数是你要设置多少个字节,返回的是被设置的地址第一个地址的指针
4.memcmp
memcmp 第一个参数是,指向要比较数的一个指针,第二个参数是指向另一个要比较的数的指针,第三个参数是要比较多少个字节。返回类型是一个 int类型的整数
当第一个参数大于第二个参数,会返回一个 大于0的数,当第一个参数小于第二个参数会返回一个小于0的数,当两个参数相等会返回0