目录
一、内存函数
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