内存函数以及大小端存储问题

本文详细介绍了C++中四个关键内存函数:memcpy、memmove、memset和memcmp的使用、实现以及大小端存储的概念,通过示例展示如何正确运用这些函数处理内存操作。
摘要由CSDN通过智能技术生成

目录

一、内存函数

1、memcpy的使用和实现

2、memover的使用和实现

3、memset函数的使用

4、memcmp函数的使用

二、大小端存储问题

一、内存函数

1、memcpy的使用和实现

      memcpy本质上是属于内存的拷贝,我们去c++网站可以查到相关内容,如图:

      根据图我们可以知道,memcpy一共传了三个参数,第一个是目的参数,也就是被复制到的地方,第二个就是复制的值来源,而我们是不期望该值被修改的,所以在该值加上了const,第三个参数是拷贝的字节参数,注意是字节,不是元素个数。

       下面我们来说一下这个函数该如何使用吧

#include<stdio.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//					0 1 2 3 4
	int arr2[20] = { 1,2,3,4,5,6,7,8,9,10,9,9,9,9,9,9,9,9 };
//					//0 1 2 3 4
//	memcpy(arr2,arr1,20);
	memcpy(arr2, arr2+2, 20);
//memcpy第一个参数是目的,第二个参数是需要存的值,第三个参数是需要存多少个字节

	int ret = sizeof(arr2) / sizeof(arr2[0]);
	for (int i = 0; i < ret; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

  这个是使用办法和运行结果,而使用这个函数,只需要有一个目的参数,复制的参数和需要复制的大小即可,而我们也可以把它们实现出来,

void* my_memcpy(void* dest, void* src, size_t num)
{
	char* ret = dest;
	assert(src && dest);
	int i = 0;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		((char*) dest)++;
		((char*) src)++;
	}
	return ret;
}

        这个是实现方法,但在vs里面memcpy和memover都是可以当作一样的,因为内部实现基本一样,但在其他的编译器不行。

2、memover的使用和实现

        对于memover来说,它属于memcpy的进阶版,比memcpy更加全面,memcpy有自己独特的缺陷,以图为例:

        当我们将12345复制到从2开始的时候,我们想把它变成11234578910,但是结果是变成11111178910,因为当第二个内存变为1的时候,那么传给下一个值也是1,而memover可以很好解决这个问题,因为它可以根据不同的情况来进行不同的复制办法,使用和mencpy一样,实现如下:

void* my_memmove(void* s1, void* s2, size_t num)
{
	char* ret = s1;
	assert(s1 && s2);
	int i = 0;
	if(s2>s1)
	while (num--)
	{
		*(char*)s1 = *(char*)s2;
		s1 = (char*)s1 + 1;
		s2 = (char*)s2 + 1;
	}
	else
	{
		while (num--)
		{
			*((char*)s1 + num) = *((char*)s2 + num);
		}
	}
	return ret;
}

3、memset函数的使用

        memset的作用就是将内存中的值以字节为单位设置成想要的内容,在c++网站查找如下:

        第一个参数:修改的目的地方,第二个参数:想把目的地方修改成什么,第三个参数:修改的字节大小,使用如下:

int main()
{
	char arr[] = "qwqerr";
	memset(arr, 'q', 5);//以字节为单位设置的
	//第一个参数:修改的目的地方,第二个参数:想把目的地方修改成什么,第三个参数:修改的字节大小
	int i = 0;
	printf(arr);
	return 0;
}

打印结果如下:

4、memcmp函数的使用

        而内存函数最后一个函数,从名字来说,我们可以知道mem是内存的意思,cmp是比较的意思,也就是内存的值比较大小,我们先去c++官网看:

        我们可以知道第一个参数和第二个参数是用来做对比的字符之类,而第三个参数也是一样以字节为单位,比较多少个字节,下面我们做一下实例:

#include<stdio.h>
#include<string.h>
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[] = { 1,2,3,4,8,8,8,8 };
	int ret = memcmp(arr1, arr2, 4);
	//第一个函数如果大于大二个函数返回正数,相等返回0,最后一个单位是字节
	printf("%d\n", ret);
	return 0;
}

        而返回的值是

,和strcmp的不同就是,它可以指定比较多少个,而strcmp需要比较全部。

二、大小端存储问题

        什么是大小端存储问题,对于这个我想以其他事情入手,比如,对于153来说,1是属于百位,5是属于十位,3属于个位,1属于高位,3属于低位,而大端存储就是先存储高位后存储低位,而小端存储则先存储低位,后存储高位,举个例子:

int main()
{
	int a = 1;
	return 0;
}

        我们通过vs查看内存的时候,我们会发现它的存储是00000001 00000000 00000000 00000000;(vs属于小端存储),而如果是大端存储的话高位在左边,那么01在最后,则会变成00000000 00000000 00000000 00000001

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值