前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言——内存函数【memcpy,memmove,memset,memcmp】

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

作者头像
用户11029137
发布2024-03-19 15:47:08
620
发布2024-03-19 15:47:08
举报
文章被收录于专栏:编程学习编程学习

一,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中:

代码语言:javascript
复制
#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}

则👇🏻

代码语言:javascript
复制
#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👇🏻

代码语言:javascript
复制
#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👇🏻

代码语言:javascript
复制
#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个字节

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,memcpy
    • 1,基本介绍
      • 2,使用实例
      • 二,memmove
        • 1,基本介绍
          • 2,使用实例
          • 三,memset
            • 1,基本介绍
              • 2,使用实例
              • 四,memcmp
                • 1,基本介绍
                  • 2,使用实例
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档