【C语言进阶】- 内存函数

内存函数

    • [1.1 内存函数的使用](#1.1 内存函数的使用)
    • [1.2 memcpy函数的使用](#1.2 memcpy函数的使用)
    • [1.3 memcpy函数的模拟实现](#1.3 memcpy函数的模拟实现)
    • [2.1 memmove函数的使用](#2.1 memmove函数的使用)
    • [2.2 memmove函数的模拟实现](#2.2 memmove函数的模拟实现)
    • [2.3 memcmp函数的使用](#2.3 memcmp函数的使用)
    • [2.4 memset函数的使用](#2.4 memset函数的使用)

1.1 内存函数的使用

内存函数就是对内存中的数据进行操作的函数

1.2 memcpy函数的使用

void* memcpy ( void * destination, const void * source, size_t num );
src 往 dest 传递数据的字节数

不用来处理重叠的内存之间的数据拷贝

c 复制代码
#include <stdio.h>
#include <string.h>
#include <assert.h>

void test1()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 28); // 从arr1中拷贝28个字节的数据给到arr1

	for (int i = 0; i < 7; i++)
	{
		printf("%d ",arr1[i]);
	}

	float arr3[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };
	float arr4[10] = { 0 };
	// 可以传递任意类型
	memcpy(arr4, arr3, 28);
}
int main()
{
	test1();
	return 0;
}

1.3 memcpy函数的模拟实现

c 复制代码
// 返回dest的起始地址
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);

	// 记录起始地址
	void* ret = dest;

	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;

}

2.1 memmove函数的使用

void* memmove ( void* destination, const void* source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

如果源空间和目标空间出现重叠,就得使用memmove函数处理。

c 复制代码
void test2()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[10] = { 0 };
	memmove(arr1+2, arr1, 20); // 可以重叠拷贝

	for (int i = 0; i < 7; i++)
	{
		printf("%d ",arr1[i]);
	}

}

int main()
{
	test2();
	return 0;
}

2.2 memmove函数的模拟实现

c 复制代码
// 返回dest的起始地址
// dest在src之前时,从前往后遍历
// src与dest重叠时,从前往后拷贝数据和从后往前都可以
// dest在src之后时,从后往前遍历
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	// 记录起始位置
	int ret = dest;

	// 从前往后
	if (dest < src)
	{
		while (num--)
		{
			*((char*)dest) = *((char*)src);
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}

	}
	// 从后往前 -> dest >= src
	else
	{
		while (num--)
		{
			*((char*)dest+num) = *((char*)src + num);
		}
	}

	return ret;

}

2.3 memcmp函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
这里比较的是内存中的每个字节中所存储的数的大小

c 复制代码
#include <stdio.h>
#include <string.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,3,2 };   // 01 00 00 00 | 03 00 00 00 | 02 00 00 00 | 04 00 00 00 
							  //                ^
	int ret = memcmp(arr1, arr2, 12);
	printf("%d\n",ret);
	return 0;
}

2.4 memset函数的使用

memset 内存设置,以字节为单位处理

void* memset( void* dest, 要设置的元素

int value, 要更改的元素

size_t size 更改几个

);

c 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "hello world";
	memset(arr, 'x', 5);
	//memset(arr+6, 'x', 3); // hello xxxld
	printf("%s\n",arr);

	return 0;
}
相关推荐
VBA63371 天前
VBA即用型代码手册:利用函数保存为PDF文件UseFunctionSaveAsPDF
开发语言
say_fall1 天前
C语言编程实战:每日刷题 - day2
c语言·开发语言·学习
上去我就QWER1 天前
Qt快捷键“魔法师”:QKeySequence
开发语言·c++·qt
Pluto_CSND1 天前
Java中的静态代理与动态代理(Proxy.newProxyInstance)
java·开发语言
惊讶的猫1 天前
LSTM论文解读
开发语言·python
獨枭1 天前
C# 本地项目引用失效与恢复全攻略
开发语言·c#·visual studio
国服第二切图仔1 天前
Rust开发之Trait 定义通用行为——实现形状面积计算系统
开发语言·网络·rust
mjhcsp1 天前
C++ 循环结构:控制程序重复执行的核心机制
开发语言·c++·算法
A阳俊yi1 天前
Spring Data JPA
java·开发语言