C语言内存函数 memcpy,memmove ,memcmp

目录
  • 一、memcpy函数
    • 1.用法
    • 2.模拟实现memcpy函数
  • 二、memmove函数
    • 1.用法
    • 2.模拟实现memmove函数
  • 三、memcmp函数
    • 1.用法
    • 2.模拟实现memcmp函数

一、memcpy函数

1.用法

memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在
strcpy只能用于字符串函数,而memcpy函数可以使用任意类型
在使用任意类型时,肯定用到的参数是void
void* memcpy(const void *dest,const void *src, size_t sum);
这里的sum作为字节数传递

#include<stdio.h>
#include<string.h>
int main()
{
 int arr[10]={0};
 int arr2[10]={1,2,3,4,5,6,7,8,9,10};
 memcpy(arr1,arr2,20);//1 2 3 4 5   /20作为字节数 即传递4个整形
 return 0;
}

2.模拟实现memcpy函数

#include<stdio.h>
#incldue<assert.h>
void*mymemcpy(const void*dest,const void*src,size_t sum)//size_t说明作为无符号数存在
{
 assert(dest&&src);
 void*ret=dest;
  while(sum--)//void*的指针 无法解引用和自加自减,解引用不知道访问几个字节,自加自减不知道跳过结果字节
  {
   *(char*)dest=*(char*)src;//这里不使用自加的原因: 因为强制类型转换是一种临时的状态 如果到++时,指针会变回void*
   dest=(char*)dest+1;
   src=(char*)src+1;
  }
  return ret;
}
int main()
{
 int arr1[10]={0};
 int arr2[10]={1,2,3,4,5,6,7,8,9,10};
 mymemcpy(arr1,arr2,20);//传递4个整形
 return 0;
 }

二、memmove函数

1.用法

memmove函数是用于处理内存重叠的情况
参数同memcpy函数相同
voidmemmove(const void dest,const void*src,size_t sum);

#include<stdio.h>
#include<string.h>
int main()
{
 int arr[]={1,2,3,4,5,6,7,8,9,10};//将 1 2 3 4 5传给 3 4 5 6 7
 memmove(arr+2,arr,20);//结果为 1 2 1 2 3 4 5
 return 0;
}

2.模拟实现memmove函数

#include<stdio.h>
#include<assert.h>
void*mymemmove(const void*dest,const void*src,size_t sum)
{
 assert(dest&&src);
 void*ret=dest;//返回目的地的初始地址
  if(src>dest)//src大于dest指针时 从前往后传递
  {
  while(sum--)
   {
     *(char*)dest=*(char*)src;
     dest=(char*)dest+1;
     src=(char*)src+1;
   }
  }
  else//src小于dest指针时 从后往前传递
  {
  while(sum--)
   {
     *(char*)(dest+sum)=*(char*)(src+sum);
   }
  }
  return ret;
}

int main()
{
 int arr[]={1,2,3,4,5,6,7,8,9,10};
 mymemmove(arr+2,arr,20);//20代表字节数 即传递5个整形
 return 0;//1 2 1 2 3 4 5
}

当3 4 5 6 7 传递给 1 2 3 4 5时
src>dest指针 从前往后传递

当1 2 3 4 5传递给 3 4 5 6 7时
src>dest指针 从后往前传递

三、memcmp函数

1.用法

同strcmp函数用法差不多 都为比较函数
但strcmp只能比较字符串之间的大小
而 memcmp函数可以比较任意类型的大小
int memcmp(const void * s1,constvoid* s2,size_t sum);

#include<stdio.h>
#include<string.h>
int main()
{
 int arr1[]={1,2,3,4,5};
 int arr2[]={1,1,3,4,5};
 memcmp(arr1,arr2,8);//8为字节数 即2个整形
 return 0;
}

2.模拟实现memcmp函数

#include<stdio.h>
#include<assert.h>
int memcmp(const void*s1,const void*s2,size_t sum)
{
  assert(s1&&s2);
  char*pa=(char*)s1;
  char*pb=(char*)s2;
  while(sum--)
  {
   if(*pa==*pb)//两者有相同才向后移 没有就等sum减为0 输出 看是大于还是小于
   {
    pa++;//如果两者一直相同 不影响判断条件sum 出循环输出
    pb++;
   }
  }
  return *pa-*pb;
}
int main()
{
 int arr1[]={1,2,3,4,5};
 int arr2[]={1,1,3,4,5};
 int ret= memcmp(arr1,arr2,8);//8为字节数 即2个整形
 printf("%d\n",ret);//1
 return 0;
} 

到此这篇关于C语言内存函数 memcpy,memmove ,memcmp的文章就介绍到这了,更多相关C语言内存函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 对比C语言中memccpy()函数和memcpy()函数的用法

    C语言memccpy()函数:复制内存中的内容 头文件: #include <string.h> 定义函数: void * memccpy(void *dest, const void * src, int c, size_t n); 函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上.与memcpy()不同的是,memccpy()会在复制时检查参数c 是否出现,若是则返回dest 中值为c 的下一个字节地址. 返回值:返回指向dest 中值为c 的

  • C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识. 1.strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str2[]={"China"}; strcpy(str1,str2); strn

  • C语言 模拟实现memcpy与memmove函数详解

    目录 一.memcpy函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 二.模拟实现memcpy函数 1.模拟分析 2.模拟实现 三.memmove函数的介绍 1.函数的声明 2.为什么会有memmove函数 3.函数功能与注意事项 4.函数的使用 四.模拟实现memmove函数 1.模拟分析 2.模拟实现 一.memcpy函数的介绍 1.函数的声明 void * memcpy ( void * destination, const void * source, size_t

  • C语言函数之memcpy函数用法实例

    目录 前言 下面是参考网友的一些总结: 补充: 背景 再来看看dest和src地址有重叠的情况 总结 前言 昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: char *mymemcpy(char *dest, const char * src, int n) { char *pdest; char *psrc; pdest = dest; psr

  • C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. void* memcpy(void* destination, const void* source, size_t num); void* dest 目标内存 const void* src 源内存 size_t num 字节个数 库中实现的memcpy函数 struct { ch

  • C语言内存函数 memcpy,memmove ,memcmp

    目录 一.memcpy函数 1.用法 2.模拟实现memcpy函数 二.memmove函数 1.用法 2.模拟实现memmove函数 三.memcmp函数 1.用法 2.模拟实现memcmp函数 一.memcpy函数 1.用法 memcpy表示内存函数,用法跟strcpy差不多, 都是作为拷贝函数存在strcpy只能用于字符串函数,而memcpy函数可以使用任意类型在使用任意类型时,肯定用到的参数是voidvoid* memcpy(const void *dest,const void *src

  • C语言内存函数的使用及其模拟实现

    目录 前言 memcpy memcmp memmove memset 总结 前言 在C语言中,我们除了会经常用到与字符相关的函数,我们还会使用到与内存相关的库函数.今天我们就来学习几个常见的内存函数吧! memcpy void * memcpy ( void * destination, const void * source, size_t num ); 这是一个内存复制函数,该函数会从source的位置开始向后复制num个字节的数据到destination的内存位置. 这个函数在遇到 '\0

  • C语言超详细讲解字符串函数和内存函数

    目录 字符串函数 长度不受限制的字符串函数 strlen strcpy strcat strcmp 长度受限制的字符串函数介绍 strncpy strncat strncmp 字符串查找以及错误报告 strstr strtok strerror 内存操作函数 memcpy memmove memcmp 字符串函数 长度不受限制的字符串函数 strlen size_t strlen ( const char * str ) 求字符串长度: 字符串以'\0' 作为结束标志,strlen函数返回的是在

  • C语言字符串函数,字符函数,内存函数使用及模拟实现

    目录 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找函数 strstr strtok strerror 字符函数 字符分类函数 字符转换函数 内存操作函数 memcpy memmove memcmp memset 求字符串长度 strlen 函数功能 字符串长度,求一个字符串中字符的个数(不包含’\0’). 函数参数: size_t strlen( const ch

  • 深入了解C语言字符函数和字符串函数

    目录 前言 求字符串长度 strlen介绍 strlen直接使用: strlen模拟实现: strlen对比sizeof 长度不受限制的字符串函数 strcpy 直接使用 模拟实现: strcat 直接使用: 模拟实现: strcmp 运行结果: 模拟实现: 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找 strstr strtok 字符分类函数 内存操作函数 memcpy memmove memcmp 总结 前言 C语言中对字符串的处理很是繁琐,但是C语言本

  • C语言的编程之美之内存函数

    目录 内存函数 memcpy内存拷贝 原格式 分析 内存拷贝的问题 memmove内存重叠拷贝 C语言规定 原格式 分析 memset内存设置 原格式 memcmp内存比较 原格式 总结 内存函数 memcpy内存拷贝 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置. 这个函数在遇到 '\0' 的时候并不会停下来. 如果source和destination有任何的重叠,复制的结果都是未定义的. 原格式 分析 **字面上意思只要是内存里面的东西

  • C语言字符串函数与内存函数精讲

    目录 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror tolower\toupper memcpy memmove memcmp memset strlen 获取字符串长度. strlen - size_t strlen( const char *string ); 1.字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’). 2.参数指向的

  • C语言深入详解四大内存函数的使用

    目录 1.memcpy 2.memmove 3.memcmp 4.memset 1.memcpy 与字符串函数 strcpy 类似,也是进行拷贝.但是需要注意的是,strcpy 是针对字符串进行拷贝,而 memcpy 是针对内存进行拷贝. 如何理解呢?strcpy 进行拷贝的时候,只能一个字节一个字节的拷贝,但要实现 整型.浮点型等数据类型拷贝的时候,就不得不用到 memcpy 了. 我们观察 strcpy 的函数声明: char * strcpy ( char * destination, c

  • C语言模拟内存函数分析之mencpy与memmove

    目录 前言 模拟实现简单的内存函数 1.memcpy-内存拷贝函数(应该拷贝不重叠的内存) 2.memmove-内存拷贝函数(可以拷贝重叠的内存) 总结 前言 内存是CPU与外存进行沟通的桥梁. 在冯·诺依曼计算机结构中,存储器是计算机的存储部件,是信息存储的核心,用来存放程序和数据. 存储器分为内存(内存储器.主存储器)和外存(外存储器.辅助存储器). CPU能够直接访问的存储器是内存.外存用于帮助主存记忆更多的信息,外存内的信息必须调入内存后,才能被CPU所使用.因此,内存是CPU与外存进行

随机推荐