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

简介: 目录一、前言二、 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的数,如果是大端就不一样了,这里就不说那么多了,下次会涉及。









目录
相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
9天前
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
17 3
|
11天前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
11天前
|
存储 缓存 算法
结构体和类在内存管理方面有哪些具体差异?
【10月更文挑战第30天】结构体和类在内存管理方面的差异决定了它们在不同的应用场景下各有优劣。在实际编程中,需要根据具体的需求和性能要求来合理选择使用结构体还是类。
|
27天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
23天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
19 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
369 0
|
22天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
45 1
|
26天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。