【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;
}
相关推荐
问道飞鱼6 分钟前
【Vue3知识】组件间通信的方式
开发语言·javascript·ecmascript·组件·通信
树下水月15 分钟前
关于使用python 安装 flask-openapi3扩展,使用docker 环境的完整复盘
开发语言·python·flask
时雨h16 分钟前
《Spring Boot+策略模式:企业级度假订单Excel导入系统的架构演进与技术实现》
开发语言·bash
程序员JerrySUN27 分钟前
驱动开发硬核特训 · Day 1
java·linux·运维·开发语言·c++·驱动开发
明明明h28 分钟前
C#网络编程(Socket编程)
开发语言·网络·c#
爱写代码的小朋友37 分钟前
PHP+Vue 3实现增删改查(CRUD)
开发语言·vue.js·php
我真的不会C1 小时前
Qt中的信号与槽及其自定义
开发语言·qt
lly2024061 小时前
PHP 过滤器
开发语言
步行cgn1 小时前
Java 集合有序性与重复性总结及记忆技巧
java·开发语言·程序人生·面试·个人开发·学习方法
仟濹1 小时前
【C/C++】双指针与前缀和
c语言·c++·算法