C/C++内存函数的用法及其实现( 超详细)

这篇具有很好参考价值的文章主要介绍了C/C++内存函数的用法及其实现( 超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:

仍有未知等待探索_C语言疑难,数据结构,PTA-CSDN博客

专题分栏:

C语言疑难_仍有未知等待探索的博客-CSDN博客

目录

一、引言

二、memcpy——内存拷贝函数

1、参数

2、用法 

3、函数的具体的作用

4、具体实现 

 三、memmove——内存移动函数(实现有重叠的拷贝)

 1、参数

2、用法 

3、函数的具体的作用

4、具体实现 

四、memcmp——内存比较函数 

1、用法


一、引言

估计大家都很疑惑,内存函数是什么东西啊。memcpy——用来实现数据拷贝的函数,都已经有strcpy了,为什么又要写一个内存拷贝函数啊。

在内存中,我们要知道不仅仅是有字符串,还有整型,浮点型等等。这些其他的类型不能用字符串拷贝函数进行拷贝,而需要我们要讲的内存拷贝函数。

内存函数—— string.h(头文件) 
内存拷贝函数 memcpy
内存移动函数(实现有重叠的拷贝) memmove
内存比较函数 memcmp

二、memcpy——内存拷贝函数

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

1、参数

destination:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。

source:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。

num:要复制的字节数。(size_t是指无符号数

2、用法 

1.函数的作用是:将source所指向的内容往后复制num个字节到destination的位置上。

2.这个函数遇到'\0'不会停止

3.这个函数遇到重叠的时候会怎么复制不确定。(有的编译器会考虑,有的编译器就不考虑)

3、函数的具体的作用

#include<stdio.h>
#include<string.h>
int main()
{
	int a[5] = {1,2,3,4,5};
	int b[10];
	memcpy(b, a,sizeof(a));//仅复制了a数组,b剩余未复制的为随机值
	for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)
		printf("%d\n", b[i]);
	return 0;
}

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

4、具体实现 

从上面库函数的声明中看见函数参数的类型是void*类型和size_t类型。

我们需要知道void*类型的指针不能直接进行解引用操作和运算操作,需要把它进行强制类型转化为所适合的类型,然后再进行相应的操作。

而对于内存中的数据,我们在写函数的时候并不知道程序员将调用这个函数来完成什么类型的数据拷贝,如果将它强转成(int*)类型的话,在需要复制的数据所占空间不是4的整数的时候在边界会一些问题。

所以我们就干脆强转成(char*)类型,来一个字节一个字节进行拷贝。

指针往后走一位的时候,记得不能直接在destination后面+1或者++操作,不合法。

#include<stdio.h>
#include<string.h>
void my_memcpy(void* destination, void* source, size_t num);
int main()
{
	int a[5] = {1,2,3,4,5};
	int b[10];
	my_memcpy(b, a,sizeof(a));
	for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)
		printf("%d\n", b[i]);
	return 0;
}
void my_memcpy(void* destination, void* source, size_t num)
{
	while (num--)
	{
		*(char*)destination = *(char*)source;
		destination = (char*)destination + 1;
		source = (char*)source + 1;
	}
}

 三、memmove——内存移动函数(实现有重叠的拷贝)

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

 1、参数

destination:指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。

source:指向要复制的数据源的指针,类型转换为 const void* 类型的指针。

num:要复制的字节数。(size_t是指无符号数

2、用法 

1。memcpy和memmove的区别:memmove适用于区域重叠的来进行拷贝。

3、函数的具体的作用

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "memmove can be very useful......";
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

4、具体实现 

这个和内存拷贝函数有异曲同工之处,唯一的不同就是需要判断是从前往后复制还是从后往前复制。如果不是下面的顺序的话,会造成覆盖,可以自行检验。

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

#define _CRT_SECURE_NO_WARNINGS  1
#include<stdio.h>
#include<string.h>
void my_memmove(void* dest, void* ser, size_t sz);
int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(a, a+2 , sizeof(a[0])*5);
	printf("my_memmove:\t");
	for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
		printf("%d ", a[i]);
	printf("\n");
	printf("memmove:\t");
	int b[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(b, b+2, sizeof(b[0]) * 5);
	for (int i = 0; i < sizeof(b) / sizeof(b[0]); i++)
		printf("%d ", b[i]);
	return 0;
}
void my_memmove(void* dest, void* ser, size_t sz)
{
	if (dest < ser)
	{
		//从头往后
		while (sz--)
		{
			*(char*)dest = *(char*)ser;
			dest = (char*)dest + 1;
			ser = (char*)ser + 1;
		}
	}
	else if (dest > ser)
	{
		//从后往前
		while (sz--)
		{
			*((char*)dest+sz) = *((char*)ser+sz);
		}
	}
	else
	{
		return;
	}
}

四、memcmp——内存比较函数 

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

这个内存比较函数和strcmp一样,没有什么新奇的,唯一的不同就是多一个参数num,用来决定判断的个数。

1、用法

注: 最后一个数据不一样不一定代表memcmp的返回值为0

#include<stdio.h>
#include<string.h>
int main()
{
	int a[] = { 1,2,3,4,5,6,7 };
	int b[] = { 1,2,3,0x11223304 };
	printf("%d", memcmp(a, b, 13));
	return 0;
}

C/C++内存函数的用法及其实现( 超详细),C语言疑难,c语言,c++,开发语言

谢谢大家的支持!

 文章来源地址https://www.toymoban.com/news/detail-715878.html

到了这里,关于C/C++内存函数的用法及其实现( 超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

    今日分享:字符、字符串函数和内存函数 内存函数 就是对内存进行操作的函数 字符串函数 就是对字符串进行操作的函数 字符函数 就是对字符进行操作的函数 str 前缀的函数是字符串函数,头文件string.h mem 前缀的函数是内存函数,头文件stdlib.h 字符分类函数包含在 ctype.h 头

    2024年03月18日
    浏览(60)
  • C语言内存函数介绍以及实现

    目录 前言 一:内存拷贝函数 (1)memcpy( )函数 (2)memove( )函数 二:内存比较函数 三:内存设置函数 本文介绍的函数的函数声明都在头文件string.h中。 函数声明:void* memcpy(void* dest,const void* src,size_t num) 作用:把一片内存空间的字节拷贝到另一片内存空间。 函数参数的意义: ①dest指

    2024年02月01日
    浏览(38)
  • C语言字串函数、内存函数介绍以及模拟实现

        目录 前言 本期内容介绍: 一、字符串函数 strlen介绍 strlen 模拟实现(三种方式) 方法一:计数器法  方法二:递归法(不创建临时变量法) 方法三:指针-指针 strcpy介绍 strcpy模拟实现 ​编辑strcmp介绍 strcmp模拟实现 strcat介绍 strcat模拟实现 strncpy介绍 strncpy模拟实现 s

    2024年02月14日
    浏览(40)
  • C语言——内存函数的使用与模拟实现

    大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing 原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝 📣系列专栏:残念ing 的C语言系列专栏——CSDN博客   目录 前

    2024年02月02日
    浏览(39)
  • 【C语言】——内存函数的使用及模拟实现

      在【C语言】——字符串函数的使用与模拟实现(上)与【C语言】——字符串函数的使用与模拟实现(下)二文中,我曾详细介绍了字符串相关函数的具体功能及其模拟实现。      然而,实践过程中,我们往往不仅仅只是处理字符串类型的变量,若要对浮点型、整型

    2024年04月28日
    浏览(36)
  • 12种初级滤波器详细介绍(及其C语言实现)

    目录 1.算术平均滤波 原理 代码 2.一阶滞后滤波 原理 代码 3.限幅消抖滤波 原理 代码 4.递推平均滤波 原理 代码 5.加权递推平均滤波 原理 代码 6.中值滤波 原理 代码 7.中位值平均滤波法 原理 代码 8.一阶低通滤波 原理 代码 9.二阶低通滤波 原理 代码 10.一阶高通滤波 原理 代码

    2024年02月06日
    浏览(54)
  • 【c语言:常用字符串函数与内存函数的使用与实现】

    简介:本篇文章是对C语言中常用的字符串函数和内存函数的学习以及模拟实现 文档内容来自:https://legacy.cplusplus.com/ 字符串以 ‘\\0’ 作为结束标志, strlen函数返回的是在字符串中 ‘\\0’ 前⾯出现的字符个数( 不包含 \\\'\\0\\\' )。 参数指向的字符串必须要以 ‘\\0’ 结束。 注意函

    2024年02月04日
    浏览(46)
  • strstr函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

     strstr()函数用于:查找子字符串 目录 函数介绍 用法示例 函数讲解 实现函数  事例展示 函数声明:char *strstr(const char *str1, const char *str2) 头  文  件:#include string.h 返  回  值: 返回值为char * 类型( 返回指向  str1  中第一次出现的  str2  的指针);如果  str2  不是 

    2024年02月13日
    浏览(49)
  • memcmp函数详解 看这一篇就够了-C语言(函数讲解、函数实现、使用用法举例、作用、自己实现函数 )

    memcmp()函数用于:比较两个内存块 函数声明:int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 参数: ptr1:指向内存块的指针。 ptr2:指向内存块的指针。 数字:要比较的字节数。 返回值: 0: 在两个内存块中不匹配的第一个字节在  ptr1  中的值低于 在 ptr2  中的值(如果计

    2023年04月09日
    浏览(64)
  • 【MATLAB】find函数及其用法

            返回一个包含数组 X 中每个 非零元素的线性索引向量 。         如果 X 为向量,则 find 返回方向与X相同的向量。如果 X 为多维数组,则 find 返回由结果的 线性索引组成的列向量 。如果 X 包含非零元素或为空,则 find 返回一个空数组。         线性索引组

    2023年04月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包