赞
踩
前言:
void* memcmp(void* destination, const void* source, size_t num);
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr2, arr1, 24);
memcpy(arr3 + 2, arr3, 20);
return 0;
}
总结:
void* my_memcpy(void* destination, const void* source, size_t num)
{
assert(destination && source);//断言,当二者之一指针为NULL则报错
void* ret = destination;//存起始地址便于返回
while (num--)//循环拷贝,每次拷贝一个字节
{
*(char*)destination = *(char*)source;
destination = (char*)destination + 1;//强制类型转换的临时的(char*)destination++;(错误)
source = (char*)source + 1;
}
return ret;
}
注意:在对 destination 和 source 指针进行操作时,要先将它们强制类型转换为 char* 类型的指针。(char* 类型的指针解引用操作时向后访问一个字节的内容)。而 void* (泛型指针)是不能进行解引用操作的。
void* memmove(void* destination, const void* source, size_t num);
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
memmove(arr1 + 2, arr1, 20);
return 0;
}
总结:
分析:
1.当要将紫色区间拷贝到蓝色区间,若采用从前往后(1,2,3,4,5)拷贝,会改变紫色区间中要进行拷贝的数据。换个思路:采用从后往前拷贝,能避免这个问题。
2.当要将紫色区间拷贝到蓝色区间,若采用从后往前(7,6,5,4,3)拷贝,会改变紫色区间中要进行拷贝的数据。换个思路:采用从前往后拷贝,能避免这个问题。
总结:
void* my_memmove(void* destination, const void* source, size_t num) { assert(destination && source);//断言 void* ret = destination;//保存起始地址 if (destination < source)//从前向后拷贝 { while (num--) { *(char*)destination = *(char*)source; destination = (char*)destination + 1; source = (char*)source + 1; } } else//从后向前拷贝 { while (num--) { *((char*)destination+num) = *((char*)source+num); } } return ret;//返回起始地址 }
int memcmp(const void* ptr1, const void* ptr2, size_t num);
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = { 1,257 };//01 00 00 00 01 01 00 00
int arr2[] = { 1,2 }; //01 00 00 00 02 00 00 00
int ret = memcmp(arr1, arr2, 8);
printf("%d\n", ret);
return 0;
}
int my_memcmp(const void* str1, const void* str2, size_t num)
{
assert(str1 && str2);
while (*(char*)str1 == *(char*)str2 && num--)//1.*(char*)str1 != *(char*)str2 2.num==0
{
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
}
if(num==0)//二者相同
return 0;
else//二者不同
return *(char*)str1 - *(char*)str2;
}
void* memset(void* destination, int value, size_t num);
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "hello world";
memset(arr + 6, 'x', 5);
printf("%s\n", arr);
return 0;
}
再比如:将arr初识化为全1(每个字节都初始化为1)
#include<stdio.h>
#include<string.h>
int main()
{
int arr[10] = { 0 };
memset(arr, 1, 40);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d\n", arr[i]);
}
return 0;
}
因为改变一次改变一个字节,而不是所以不适合初始化整形数组。适合修改字符串内容。
void* my_memset(void* destination, int value, size_t size)
{
assert(destination);
void* ret = (char*)destination;//保留目标空间的起始地址便于之后的返回
while (size--)
{
*(char*)destination = value;
destination = (char*)destination + 1;
}
return ret;
}
创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。