【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;
}
相关推荐
爱吃烤鸡翅的酸菜鱼2 分钟前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
心情好的小球藻39 分钟前
Python应用进阶DAY9--类型注解Type Hinting
开发语言·python
惜.己1 小时前
使用python读取json数据,简单的处理成元组数组
开发语言·python·测试工具·json
Y4090011 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记
古月-一个C++方向的小白6 小时前
C++11之lambda表达式与包装器
开发语言·c++
沐知全栈开发7 小时前
Eclipse 生成 jar 包
开发语言
杭州杭州杭州8 小时前
Python笔记
开发语言·笔记·python
tanyongxi668 小时前
C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
开发语言·c++
棐木9 小时前
【C语言】动态内存管理
c语言·free·malloc·realloc·calloc·动态内存
阿葱(聪)9 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes