C语言——内存函数【memcpy,memmove,memset,memcmp】

📝前言:

在之前的文章C语言------字符函数和字符串函数(一)中我们学习过strcpystrcat等用来实现字符串赋值和追加的函数,那么除了字符内容,其他的数据(例如整型)能否被复制或者移动呢

答案是:可以的!

这篇文章我们就来学习一下C语言内存函数:
1,memcpy
2,memmove
3,memset
4,memcmp

🎬个人简介:努力学习ing

📋个人专栏:C语言入门基础

🎀CSDN主页 愚润求学

🌄每日鸡汤:慕强,所以要变得更强


文章目录

一,memcpy

1,基本介绍

我们先看C library对它的介绍👇🏻

🔍重点提取:

①所在头文件:string.h

②函数原型:

void * memcpy ( void * destination, const void * source, size_t num );

destination(目标空间),source(源头),num(字节个数)

③函数功能:
●从source指向的位置开始向后复制num个字节的数据到destination指向的位置

④注意:

●函数在遇到\0的时候不会停止

●如果要复制num个字节,那么source和destination的数组大小至少为num字节

●如果source和destination的内存块有重叠,那复制的结果是未定义的(有重叠的时候,最好用memmove)

2,使用实例

假如我们要把整型数组arr1中的前五个数复制到arr2中:

c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1,5*sizeof(int)); //复制5个整型(共20个字节)
	//打印arr2 观察结果
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

输出结果👇🏻

可以发现:数组arr1的前五个数据,被复制到了arr2前五个数据的位置

二,memmove

1,基本介绍

那么前面所提到的内存块重叠,例如:

arr1 [10] = {0,1,2,3,4,5,6,7,8,9};

我们希望把arr1中的2,3,4复制到3,4,5的位置,即变成:
arr1 [10] = {0,1,2,2,3,4,6,7,8,9}

面对内存有重叠时,我们不使用memcpy,而应该使用memmove👇🏻

🔍

●功能:

从source指向的位置开始向后复制num个字节的数据到destination指向的位置(是不是感觉和memcpy一样)

so👇🏻

●区别:
memmove函数可以用来处理源内存块和目标内存块重叠的情况

2,使用实例

假如我们还是要实现:

arr1 [10] = {0,1,2,3,4,5,6,7,8,9};

我们希望把arr1中的2,3,4复制到3,4,5的位置,即变成:
arr1 [10] = {0,1,2,2,3,4,6,7,8,9}

则👇🏻

c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	memmove(arr1+3, arr1+2,3*sizeof(int)); 
	//从arr1+2的位置开始,往后面复制3个整数到arr1+3
	//打印arr1 观察结果
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

输出结果:

三,memset

1,基本介绍

🔍重点提取:

①所在头文件:string.h

②函数原型:

void * memset ( void * ptr, int value, size_t num );

ptr(要设置的内存),value(要赋的值),num(字节个数)

③函数功能:
将ptr指向的内存的前num个字节设置成value

④注意:

●这个函数是一个字节一个字节的改

2,使用实例

假如我们要把hello world的前5个字节改成x👇🏻

c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "hello world";
	memset(str, 'x', 5);
	printf(str);
	return 0;
}

输出结果:

假如我们要改整型数组:

arr[5] = {1,2,3,4,5};的前2个数字改成0👇🏻

c 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	memset(arr, 0, 2*sizeof(int));
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

输出结果:

四,memcmp

1,基本介绍

●函数原型:int memcmp ( const void * ptr1, const void * ptr2, size_t num );

●功能:从ptr1和ptr2指向的位置开始,向后比num个字节

●比较方法及返回:(和strncmp类似)strncmp是一个一个字符的比,memcmp是一个一个字节的比(可以比较其他类型的数据,适用范围更广)

【如果有不知道如何比较的,可以看C语言------字符函数和字符串函数(二)里面对strcmp的比较的讲解

2,使用实例

我们来比较几个整型数组👇🏻

输出结果:

注意:

比较的时候num不要超过数组自身的大小

如:arr1和arr3比16个字节,这是有问题的。因为arr3只存放了3个整数,最多比12个字节


🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关推荐
考虑考虑26 分钟前
Jpa使用union all
java·spring boot·后端
用户3721574261351 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊2 小时前
Java学习第22天 - 云原生与容器化
java
渣哥4 小时前
原来 Java 里线程安全集合有这么多种
java
间彧4 小时前
Spring Boot集成Spring Security完整指南
java
间彧4 小时前
Spring Secutiy基本原理及工作流程
java
Java水解5 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆7 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学8 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole8 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端