这篇博客让我们再来认识两个内存函数,这两个函数也会在我们日后写代码过程中经常遇到的。
目录
1.memcmp(内存比较)
1.1认识函数
1.函数功能:比较内存中两个字符的大小,也就是比较大小函数
2.头文件:#include<string.h>
3.使用格式:int memcmp( const void *buf1, const void *buf2, size_t count );
4.函数比较buf1和buf2指针开始后的count个字节
5.函数的返回值:
buf1>buf2,返回大于0的数
buf1=buf2,返回0
buf1<buf2,返回小于0的数
下面让我们来看一下具体实现
1.2函数示例
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//memcmp
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,5,6,7 };
int ret = memcmp(arr1, arr2, 8);//这里的8代表的是字节数,而不是整型
printf("ret=%d\n", ret);
return 0;
}
相信很多小伙伴们不理解问什么ret的值就等于0了,下面我们来分析一下:
arr1 和arr2在内存中的存放位置是这样的(小端存储)
所以就是相等的。
1.3模拟实现
int my_memcmp(const void* ptr1, const void* ptr2, size_t count)
{
assert(ptr1 && ptr2);
while (--count)
{
if (*(char*)ptr1 == *(char*)ptr2)
{
ptr1=(char*)ptr1 + 1;
ptr2=(char*)ptr2 + 1;
}
if (*(char*)ptr1 > *(char*)ptr2)
return 1;
if (*(char*)ptr1 < *(char*)ptr2)
return -1;
}
return 0;
}
int main()
{
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 1,2,5,6,7 };
int ret = my_memcmp(arr1, arr2, 8);
printf("ret=%d\n", ret);
return 0;
}
2.memset(内存设置)
2.1认识函数
1.函数功能:将内存设置为指定的字符,也就是以字节为单位设置内存中的数据
2.头文件:#include<string.h>或者#include<memory.h>
3.函数格式:void *memset( void *dest, int c, size_t count );
4.count:单位是字节
5.memset函数较多用来初始化一块内存,因为它是以字节为单位存放的,如果用来设置值,每个字节都会被设置为这一个值,最后结果肯定与我们需要设置的值不同:
加入,我们要把一个数组的每个值都设置为1,如代码所示:
int main() { int arr[10] = { 0 }; memset(arr, 1, 40); int i = 0; for (i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
我们看到运行结果并不是预期的每一个数都是1,这是因为,memset函数的单位是字节,也就是内存中计算的是01 01 01 01等40个01,然后一个整型是4个01,换成十进制是16843009
所以,我们一般不把memset函数用来设置值,这样不方便控制
我们通过代码来深度理解
2.2函数示例
//memset
int main()
{
char arr[] = "hello world!!!";
memset(arr, '*', 5);
printf("%s",arr);
return 0;
}
memset函数进行内存数据设置的时候,不仅能从字符串首地址设置,还能从字符串任意位置开始设置,比如我们要把world设置为“#”,这时,我们只需要让首地址+6,跳过hello和空格开始:
int main() { char arr[] = "hello world!!!"; memset(arr+6, '#', 5); printf("%s", arr); return 0; }
2.3模拟实现
void my_memset(void* ptr, char value, size_t count)
{
assert(ptr);
while (count--)
{
*(char*)ptr = value;
ptr = (char*)ptr+1;
}
}
int main()
{
char arr[] = "hello world!!!";
my_memset(arr, '*', 5);
printf("%s\n", arr);
return 0;
}
这就是这两个函数了,希望大家可以理解!