内存函数详解

前言

我们在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个字节。
在这里插入图片描述

三、总结

以上就是对内存函数的详细介绍,希望对你能有所帮助,喜欢的可以来一波三连!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值