内存函数
- 1.1 内存函数的使用
- 1.2 memcpy函数的使用
- 1.3 memcpy函数的模拟实现
- 2.1 memmove函数的使用
- 2.2 memmove函数的模拟实现
- 2.3 memcmp函数的使用
- 2.4 memset函数的使用
1.1 内存函数的使用
内存函数就是对内存中的数据进行操作的函数
1.2 memcpy函数的使用
void* memcpy ( void * destination, const void * source, size_t num );
src 往 dest 传递数据的字节数
不用来处理重叠的内存之间的数据拷贝
#include <stdio.h>
#include <string.h>
#include <assert.h>void test1()
{int arr1[] = { 1,2,3,4,5,6,7 };int arr2[10] = { 0 };memcpy(arr2, arr1, 28); // 从arr1中拷贝28个字节的数据给到arr1for (int i = 0; i < 7; i++){printf("%d ",arr1[i]);}float arr3[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7 };float arr4[10] = { 0 };// 可以传递任意类型memcpy(arr4, arr3, 28);
}
int main()
{test1();return 0;
}
1.3 memcpy函数的模拟实现
// 返回dest的起始地址
void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && src);// 记录起始地址void* ret = dest;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;}
2.1 memmove函数的使用
void* memmove ( void* destination, const void* source, size_t num );
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
void test2()
{int arr1[] = { 1,2,3,4,5,6,7 };int arr2[10] = { 0 };memmove(arr1+2, arr1, 20); // 可以重叠拷贝for (int i = 0; i < 7; i++){printf("%d ",arr1[i]);}}int main()
{test2();return 0;
}
2.2 memmove函数的模拟实现
// 返回dest的起始地址
// dest在src之前时,从前往后遍历
// src与dest重叠时,从前往后拷贝数据和从后往前都可以
// dest在src之后时,从后往前遍历
void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest && src);// 记录起始位置int ret = dest;// 从前往后if (dest < src){while (num--){*((char*)dest) = *((char*)src);dest = (char*)dest + 1;src = (char*)src + 1;}}// 从后往前 -> dest >= srcelse{while (num--){*((char*)dest+num) = *((char*)src + num);}}return ret;}
2.3 memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
这里比较的是内存中的每个字节中所存储的数的大小
#include <stdio.h>
#include <string.h>
int main()
{// 这里比较的是内存中的每个字节中所存储的数的大小int arr1[] = { 1,2,3,4 }; // 01 00 00 00 | 02 00 00 00 | 03 00 00 00 | 04 00 00 00 int arr2[] = { 1,3,2 }; // 01 00 00 00 | 03 00 00 00 | 02 00 00 00 | 04 00 00 00 // ^int ret = memcmp(arr1, arr2, 12);printf("%d\n",ret);return 0;
}
2.4 memset函数的使用
memset 内存设置,以字节为单位处理
void* memset( void* dest, 要设置的元素
int value, 要更改的元素
size_t size 更改几个
);
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "hello world";memset(arr, 'x', 5);//memset(arr+6, 'x', 3); // hello xxxldprintf("%s\n",arr);return 0;
}