1.memcpy
函数原型:
void *memcpy( void *dest, const void *src, size_t count );
void *dest
目标数据首元素地址const void *src
源数据(需要拷贝过去的数据)size_t count
需要拷贝数据的字节大小void *memcpy
拷贝结束后,返回目标数据的起始地址
函数作用: 拷贝 count
个字节的数据从源数据起始地址到目标空间。
函数的使用
#include <stdio.h>
#include <string.h>
int main() {
int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
int nums2[10] = { 0 };
memcpy(nums2 , nums1 , 20);
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d " , nums2[i]);
}
return 0;
}
函数的模拟实现:
#include <assert.h>
void* _memcpy(
void * dest,
const void * src,
size_t count
) {
assert(dest != NULL && src != NULL);
void* temp = dest;
while (count) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
count--;
}
return temp;
}
注:
1.memcpy
和 strcpy
的区别是 memcpy
可以拷贝任意类型的数据,但是 strcpy
只可以对字符串使用。
2.memcpy
不可以拷贝同一块内存空间的数据。
2.memmove
函数原型:
void *memmove( void *dest, const void *src, size_t count );
void *dest
目标数据首元素地址const void *src
源数据(需要拷贝过去的数据)size_t count
需要拷贝数据的字节大小void *memmove
拷贝结束后,返回目标数据的起始地址
函数作用: 拷贝 count
个字节的数据从源数据起始地址到目标空间。与 memcpy
不同的是,memmove
可以拷贝同一块内存空间的数据。
函数的使用
#include <stdio.h>
#include <string.h>
int main() {
int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
memmove(nums1 + 2, nums1, 20); // 1 2 1 2 3 4 5 8 9 10
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d ", nums1[i]);
}
return 0;
}
函数的模拟实现:
#include <assert.h>
void* _memmove(
void* dest,
const void* src,
size_t count
) {
assert(dest != NULL && src != NULL);
void* temp = dest;
if (src < dest) {
// 从后向前拷贝
while (count) {
*((char*)dest + count - 1) = *((char*)src + count - 1);
count--;
}
}
else {
// 从前向后拷贝
while (count) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
count--;
}
}
return temp;
}
memmove
在实现的过程中,要分两种情况。
- 当
src
小于dest
时,我们需要从后向前拷贝数据,防止数据的覆盖。 - 当
src
大于dest
时,我们需要从前向后拷贝数据,防止数据的覆盖。
3.memcmp
函数原型:
int memcmp( const void *buf1, const void *buf2, size_t count );
const void *buf1
数据1首元素地址const void *buf2
数据2首元素地址size_t count
需比较数据的多少个字节int memcmp
返回一个整型- > 0 说明第一个数据大于第二个数据
- < 0 说明第一个数据小于第二个数据
- = 0 说明两个数据相等
函数作用: 比较 count
个字节两个数据域中的数据是否相等。
函数的使用
#include <stdio.h>
#include <string.h>
int main() {
int nums1[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
int nums2[10] = { 1 , 2 , 3 , 4 , 5 };
printf("%d" , memcmp(nums1 , nums2 , 20)); // 0
return 0;
}
4.memset
函数原型:
void *memset( void *dest, int c, size_t count );
void *dest
被填充数据的首元素地址int c
填充的数据size_t count
填充的多少字节的数据void *memset
返回填充后数据的首元素地址
函数作用: 内存空间填充数据。
函数的使用
#include <stdio.h>
#include <string.h>
int main() {
int nums[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 };
int * res = (int*)memset(nums , 0 , 20);
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d " , *(res + i));
}
return 0;
}
注:
memset
会把数据的每一个字节都填充成你要填充的那个元素。