Hello,小伙伴们,今天我们来学习一下C语言中的各种内存函数,只要把各种函数使用好了,那么我们写代码的效率可谓是事倍功半。OK,正文开始,各位小伙伴们系好安全带,要发车了。
1.memcpy函数的使用和模拟实现
这个函数的全称是Copy block of memory ,意思是“内存拷贝”,我们先来看一下它的参数是什么吧
void * memcpy ( void * destination, const void * source, size_t num );
第一个参数void * destination(目的地)
指向要复制内容的目标数组的指针,类型转换为 void* 类型的指针
第二个参数 const void * source(源头)
指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
第三个参数size_t num
要复制的字节数。size_t,是无符号整数类型。
整形数组拷贝
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
//将arr1中的1,2,3,4,5拷贝到arr2中
memcpy(arr2, arr1, 5 * sizeof(int));//第三个参数也可以直接写20
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
return 0;
}
这个代码的运行结果是1 2 3 4 5 0 0 0 0 0
如果想把arr1中的“4,5,6,7,8”拷贝到arr2中,那么只用把第二个参数写为arr1+3(数组名是首元素的地址,在加3好了),运行结果是4 5 6 7 8 0 0 0 0 0
字符数组拷贝
这个函数有3个点需要注意
void* my_memcpy(void* dest,const void* src,size_t num)
{
void* ret= dest;
while (num--)
{
*(char*)dest = *(char*)src;//把void*强制转化为char*
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
//将arr1中的4,5,6,7,8拷贝到arr2中
my_memcpy(arr2, arr1+3, 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 );
参数和memcpy没有区别,在这里就不过多解释了
模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
//模拟实现
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
if (dest < src)
{
//前->后
while (num--)
{
*(char*)dest = *(char*)src;//把void*强制转化为char*
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//后->前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1+2, arr1, 20);//把1,2,3,4,5拷贝到3,4,5,6,7当中
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
3.memset函数的使用
函数的功能是内存设置,将内存中的值以字节为单位设置成想要的内容。
void * memset ( void * ptr, int value, size_t num );
第一个参数 void * ptr
指向要填充的内存块的指针
第二个参数 int value
要设置的值。该值以 int 形式传递,但该函数使用此值的无符号 char 转换填充内存块。
第三个参数 size_t num
要复制的字节数。size_t,是无符号整数类型。
例子如下
4.memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
函数的功能是:将 ptr1 指向的内存块的第一个字节与 ptr2 指向的第一个 num 字节进行比较,如果它们都匹配,则返回零,或者返回一个不同于零的值,如果它们不匹配,则表示哪个值更大。 请注意,与 strcmp 不同,该函数在找到 null 字符后不会停止比较。
参数一和参数二:指向内存块的指针
参数三:要比较的字节数。
返回值
好了,就简单介绍到这里,如果有不懂的小伙伴,可以点这个链接,可以自己去查看一下
cplusplus.com - The C++ Resources Network
好难啊!!!!