与字符串操作函数不同的是,内存操作函数不仅可以对字符型数组进行操作,还可以对整型、浮点型等类型数组进行操作(可操作范围更广)【memcpy、 memmove 、memcmp 、 memset】
1、memcpy
类型:void* memcpy(void* dest,const void* src,size_t count)
1.1 用法
(在不同内存空间中进行copy)(不可以实现重叠内存的拷贝)
#include <stdio.h>
#include <memory.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[5] = { 0 };
memcpy(arr2, arr1, 16);
//这里的16,指的是拷贝的字符数量
return 0;
}
1.2 模拟实现过程
#include <stdio.h>
#include <memory.h>
#include <assert.h>
void* my_memcpy(void* dest,const void* src,size_t count)
{
assert(dest && src);
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
src = (char*)src + 1;
dest = (char*)dest + 1;
}
return ret; //memcpy返回的是目标数组的首元素地址
}
int main()
{
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
int arr2[5] = {0};
my_memcpy(arr2,arr1,16);
return 0;
}
2、memmove
(在同一内存空间中进行copy)(可以实现重叠内存的拷贝)
类型:void* memmove(void* dest, const void* src,size_t count)
(注:)dest是目标内存空间首元素的地址;src是源内存空间首元素的地址;count是需要copy的字节数
2.1 用法
#include <stdio.h>
#include <memory.h>
int main()
{
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
memmove(arr+2,arr,16);
return 0;
}
2.2 模拟实现过程
#include <stdio.h>
#include <assert.h>
void* my_memory(void* dest,const void* src,size_t count)
{
//src:00 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 dest:02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
assert(dest && src);
void* ret = dest;
if (dest > src) //从后往前copy
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
else //从前往后copy
{
while (count--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest+1;
src = (char*)src+1;
}
}
return ret;
}
int main()
{
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
my_memory(arr+3,arr,16);
return 0;
}
3、memcmp
memcmp:【内存比较】(在内存中操作:逐个字节的进行比较大小)
类型:int memcmp( const void *buf1, const void *buf2, size_t count )
注: buf1: First buffer; buf2:Second buffer; count: Number of characters
#include <stdio.h>
#include <memory.h>
int main()
{
int arr1[] = {1,2,3,4}; // 在内存中:低地址- 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 -高地址
int arr2[] = {1,2,3,4,0x11223304};// 低地址- 01 00 00 00 02 00 00 00 03 00 00 00 04 33 22 11 -高地址
int ret = memcmp(arr1,arr2,14);
printf("%d\n",ret);
return 0;
}
4、memset
memset:【内存设置】
类型: void* memset(void* dest, int c, size_t count)
注:dest: Pointer to destination; c:Character to set; count: Number of characters;
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
memset(arr,1,16);//memset是以字节为单位来初始化内存单元的
return 0;
}
文章详细介绍了C语言中的四个内存操作函数:memcpy用于非重叠内存的复制,memmove则能处理重叠内存的复制,memcmp用于比较两块内存区域的内容,memset用于设置内存区域的值。每个函数的用法和模拟实现过程都有所展示,强调了它们在处理不同类型数组时的适用性。

被折叠的 条评论
为什么被折叠?



