mem系列函数的实现
大家都知道 ,c语言中有一系列的字符串操作函数(如果你不清楚,过来看这里 字符串函数解析)。
但是这些函数仅限作用于字符 串 ,因为这些函数,都是以'\ 0'作为结束条件的 ,'\ 0'的ascll值是 0 ,所以 如果操作
数组的话 ,就会有一个问题 ,只要遇到 0就会停止 。所以 不行 。
所以在此处 ,就提出了内存操作函数 memory
内存操作函数 ,我知道的
包括:
memcpy内存拷贝函数
memove内存移动函数
memset内存设置函数
1、memcpy内存拷贝函数
void *memcpy( void *dest, const void *src, size_tcount);
memcpy函数 的参数 类型 void* const void * size_t
什么意思?
就是 参数类型为 无类型指针 ,表示什么样的 类型都适用 所以 void* 又被称为万能指针
但是有一点要记住 ,就是 不要对于 void * 的指针进行加减操作,
因为它是无类型 ,所以每个指针 移动时 ,不知道地址的偏移量。
因此,操作时一般转换为char类型的指针 ,因为大小为1字节,操作的空间单位大小也是 1字节
count表示要操作的空间大小 ,单位是字节 。size_t表示无符号整型
代码实现
void *My_memcpy(void *dest ,const void *src,size_t num)//将src拷贝到dest上 ,num为空间大小 size_t表示的是无符号整型
{
void *ret =dest;//void * 表示的是无类型的指针 ,可以接受任何类型的指针,又称万能指针
char *pdest = (char *)dest;//将指针转化成char* ,是因为char类型的空间字节数为1
char *psrc = (char *)src;
assert(dest);
assert(src);
while(num--)//判断空间是否结束
{
*pdest++ = *psrc++;
}
return ret;
}
2.memove内存移动函数
memove函数和 memcpy函数 其实有很多 的共同之处 ,可以说 memove函数 是 memcpy函数的一个拓展
因为 内存移位时会出现重叠现象
比如 :
数组arr[10]={0,1,2,3,4,5,6,7,8,9};
将入你要将 arr[3]位置向后3字节空间 移动 到arr[4]向后 3字节的空间
最后 ,输出的数组应该是 0 1 2 3 3 4 5 7 8 9
但是 ,你要是用 memcpy函数 就会遇到一个问题 从前开始拷贝 时到 arr[4]位置是 空间的内容已经改变 了
所以 ,要从后向前拷贝
memove函数就是会在此处对于 从前拷贝还是从拷贝 ,做了一次判断
代码实现
void *My_memmove(void *dest ,const void *src,size_t num)//将src拷贝到dest上 ,num为空间大小 size_t表示的是无符号整型
{
void *ret =dest;
char *pdest = (char *)dest;
char *psrc = (char *)src;
assert(dest);
assert(src);
if(pdest > psrc)//判断是否需要从后往前移位
{
while(num--)//从后向前 空间减少 知道为 0
{
*(pdest+num)=*(psrc+num);
}
}
else//从前拷贝
{
while(num--)
{
*pdest++ = *psrc++;
}
}
return ret;
}
3.memset 内存设置函数
这个函数的作用就是在一段空间里 ,放上自己所要放的 值
应用到 程序里的意思就是 为一段空间 赋初值
void *memset( void *dest, intc, size_tcount );
返回值 为 空间首地址 c表示要初始的值 ,count表示的是空间大小
这个函数 ,还可以 用来将 一个空间 清零
下次如果要 将
某段空间赋初值 ,可以使用这个函数
代码实现
void *My_memset(void *dest, int c, size_t count )//dest 表示要初始化空间的首地址
{
void *ret =dest;
char *str =(char *)dest;
size_t i= 0 ;
assert(dest);
for(i = 0 ;i< count ;i++)
{
*(str+i) = c; //将每个位置都给c
}
return ret;
}
这篇博客是 草草写的 ,不是很好,大家多包涵 !!!!
如果了解memcpy与strcpy函数区别 ,过来看这里