前言
我们在C语言的学习过程中往往会遇到内存函数,到这里多同学就很一疑惑,什么是内存函数呢?别担心,今天我们就来学习内存函数。
一、内存函数是什么
内存函数就是通过访问地址的方式操作对象可应用于任何类型的对象。
二、内存函数的分类
1.memcpy
void * memcpy ( void * destination, const void * source, size_t num );
1.函数memcpy从指针source开始往下拷贝num个字节的数据到destination所对应的空间
2.此函数在遇到‘\0’是不会停下,仍会自动拷贝
3.如果source和destination有所重叠,那么复制的结果都是未定义的
4.memcpy函数的传参对象都是void类型,因此可以拷贝任意数据类型
memcpy函数的模拟实现,直接上代码。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10};
int arr2[10] = { 0 };
my_memcpy(arr2, arr1, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
2.memmove
void * memmove ( void * destination , const void * source , size_t num );
1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
2.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
memmove函数的模拟实现,也是直接上代码。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dis, const void* src, size_t count)
{
assert(dis && src);
void* ret = dis;
if (dis < src)
{
while (count--)
{
*(char*)dis = *(char*)src;
dis = (char*)dis + 1;
src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)dis + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
my_memmove(arr + 5, arr, 5 * sizeof(arr[0]));
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3、memset
void *memset(void *ptr, int value, size_t n);
ptr:指向要填充的内存块的指针。
value:要设置的值。该值以int形式来传递,但该函数使用此值的无符号char转换来填充内存块。
size_t:字节数,无符号整型。
memset函数的模拟实现。
#include<stdio.h>
#include<assert.h>
void* my_memset(void* ptr, int value, size_t num)
{
assert(ptr);
void* p = ptr;
while (num--)
{
*((char*)ptr) = (char) value;
ptr = (char*)ptr + 1;
}
}
4、memcmp
int memcmp ( const void * ptr1 , const void * ptr2 , size_t num );
该函数来比较从ptr1和ptr2指针开始的第num个字节。
三、总结
以上就是对内存函数的详细介绍,希望对你能有所帮助,喜欢的可以来一波三连!!!