注:使用内存函数需包含头文件
本文主要介绍四种内存函数,分别为memcpy内存拷贝函数、memmove内存重叠拷贝函数、memcmp内存比较函数以及memset内存设置函数。
1.函数参数:
void * memcpy ( void * destination, const void * source, size_t num );
2.使用方式:
例:从arr拷贝5个元素到arr1中
#include
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int arr2[10] = { 0 };
memcpy(arr2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr2[i]);
}
}
void* my_memcpy(void* dest,const void* src,size_t num)
{
assert(dest && src);
void* ret = dest; //记录位置
while (num--)
{
//dest和src是void*类型,不能直接解引用,先强转成char*型(因为可能长度不是4整数,不能int*)
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
}
1.函数参数:
void * memmove ( void * destination, const void * source, size_t n)
2.使用方式:
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr+2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3.模拟实现:
#include
#include
void* my_memmove(void* dest, const void* str, size_t num)
{
void* s = dest;
assert(dest && str);
if (dest < str)
{
while (num--)
{
//前 -> 后
*(char*)dest = *(char*)str;
dest = (char*)dest + 1;
str = (char*)str + 1;
}
}
else
{
//后 -> 前
while (num--)
{
*((char*)dest + num) = *((char*)str + num);
}
}
return s;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr + 2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
1.函数参数:
int memcmp ( const void * ptr1, const void * ptr1, size_t num );
2.使用方式:
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int str[10] = { 1,2,3,2,2,9,8,9 };
int ret = memcmp(arr, str, 20);
if (ret > 0)
printf("arr > str\n");
else if (ret < 0)
printf("arr1 < str\n");
else
printf("arr1 == str\n");
return 0;
}
3.模拟实现:
int my_memcmp(const void* ptr, const void* ptr2,size_t num)
{
while (num--)
{
if (*(char*)ptr < *(char*)ptr2)
return -1;
else if (*(char*)ptr > *(char*)ptr2)
return 1;
}
return 0;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8 };
int str[] = { 1,2,3,8,9 };
int ret = memcpy(arr, str, 20);
if (ret > 0)
printf("arr > str\n");
else if (ret < 0)
printf("arr1 < str\n");
else
printf("arr1 == str\n");
}
1.函数参数:
void * memset ( void * ptr, int value, size_t num );
2.使用方式:
int main()
{
int arr[10] = { 0 };
memset(arr, 1, 8); //这里写1,并不能把前两个元素置为1,原因:在内存中实际上是01010101
int i = 0;
for (i = 0; i < 5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
内存函数本质上与字符串函数的思想相近,不过在memset、以及模拟实现上需要注意,尤其要考虑内存中的存储方式。