类字符串函数---内存函数的使用以及模拟实现(下)

简介: 目录一、前言二、 memmove和memcmp函数1.memmove函数(内存移动)函数的使用:memmove函数的模拟实现2、memcmp函数(内存比较)函数的使用:

一、前言


    前面我们已经讲了memcpymemset函数的使用,相信小伙伴们对这两个函数已经

非常熟悉了,(如果还不是很熟悉,可以看看上篇)那么我们现在要学习另外两个函数

memmovememcmp


本章内容memmove和memcmp函数


二、 memmove和memcmp函数


1.memmove函数(内存移动)


函数参数形式:void*memmove(void*destination,const void*source,size_t num);


其中num是无符号的整数,单位是字节。memcpy函数不能实现重复部分的拷贝,


如在同一个数组中无法实现,但是memmove可以实现重复内存拷贝。也可以说


memcpy是memmove的子集。


函数的使用


#include<stdio.h>
#include<string.h>
int main()
{
  int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  memmove(arr1,arr1+2,20);
  for (int i = 0; i < 10; i++)
  {
    printf("%d ", arr1[i]);//34567678910
  }
  return 0;
}


memmove函数的模拟实现

#include<stdio.h>
#include<assert.h>
void*my_memmove(void*dest, const void*src, size_t num)
 {
  assert(dest&&src);
  void*ret = dest;
  if (dest < src)
  {
    while (num--)
    {
      *(char*)dest = *(char*)src;
      ++(char*)dest;
      ++(char*)src;
    }
  }
  else
  {
    while (num--)
      {
        *((char*)dest + num) = *((char*)src + num);
        --(char*)dest;
        --(char*)src;
      }
  }
  return ret;
 }
int main()
{
  int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  my_memmove(arr1, arr1+2, 5 * sizeof(int));
  for (int i = 0; i < 10; i++)
  {
    printf("%d", *(arr1 + i));//34567678910
  }
  return 0;
}


2、memcmp函数(内存比较)


 memcpy函数参数形式int memcmp(const void *str1,const void* str2,size_t num);


这个函数的返回类型是int ,nu单位是字节(一个int 4字节),str1大于str2返回一个


大于0的数,str1小于str2则返回一个小于0的数,等于则返回0。


#include<stdio.h>
#include<string.h>
int main()
{
  int arr1[10] = { 1, 2, 3, 4, 5, 6, 7 };
  int arr2[10] = { 1, 2, 3, 4, 5, 8, 9 };
  int kc = memcmp(arr1, arr2, 20);
  printf("%d", kc);
  return 0;
}


注意:本电脑是小端存储模式(以后会讲),简单的说就是高位存高地址,大端则相反如1为


00000001,小端模式下为01000000。


简单的说一下:如图


微信图片_20220105140216.png


在小端中:

#include<stdio.h>
#include<string.h>
int main()
{
  int arr1[10] = { 1, 2, 3, 4, 5, 6, 7 };
  int arr2[10] = { 1, 2, 3, 4, 5, 8, 9 };
  int kc = memcmp(arr1, arr2, 21);
  printf("%d", kc);
  return 0;
}


结果是一个小于0的数,vs编辑器默认是-1,原因在于前面20个字节相同,但是第21个字节,


如图:


微信图片_20220105140316.png


所以arr1小于arr2,返回小于0的数,如果是大端就不一样了,这里就不说那么多了,下次会涉及。









目录
相关文章
|
2月前
|
存储 程序员 Python
Python类的定义_类和对象的关系_对象的内存模型
通过类的定义来创建对象,我们可以应用面向对象编程(OOP)的原则,例如封装、继承和多态,这些原则帮助程序员构建可复用的代码和模块化的系统。Python语言支持这样的OOP特性,使其成为强大而灵活的编程语言,适用于各种软件开发项目。
18 1
|
2月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
2月前
|
缓存 程序员
封装一个给 .NET Framework 用的内存缓存帮助类
封装一个给 .NET Framework 用的内存缓存帮助类
|
2月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
2月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
2月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
3月前
|
Java Perl
JVM内存问题之如何统计在JVM的类加载中,每一个类的实例数量,并按照数量降序排列
JVM内存问题之如何统计在JVM的类加载中,每一个类的实例数量,并按照数量降序排列
|
2月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
3月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
215 14
|
2月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储

热门文章

最新文章

下一篇
无影云桌面