c语言中一些重要的内存操作函数以及模拟实现


1.内存操作函数
//memcpy()   memmove()   memset()   memcmp()      字符操作函数操作的是字符串,和字符串数组。但是对整型的,结构体之类的东西并没有办法进行操作
// (因为很多字符串函数的参数都是char*类型的

2.memcpy()内存拷贝函数
// 最后一个参数是字节数大小也就是想把sou里面的num字节拷贝进前面的空间
//前两个参数都是空间,也就是地址,最后一个参数的单位是字节
//函数memcpy从sou的位置开始向后复制num个自己的数据到des的内存位置
//这个函数在遇到\0时并不会停下来
//如果sou和des有任何的重叠,复制的结果都是未定义的                   ----这句话的意思是这两个数组在空间上不能有重叠的部分
//复制的时候是先从内存的低地址开始进行复制的
//c语言标准规定,memcpy只要能拷贝空间不重叠的字符串就行,虽然库函数也能够进行空间重叠的字符串拷贝

//void*-通用类型指针

//#include<stdio.h>
//#include<memory.h>
//#include<assert.h>

//经典的my_memcpy()                     size_t是typedef unsigned int size_t;          -----也就是本质上是一个长整形
//void* my_memcpy (void* p1,void* p2,size_t num)//复制多少个字节就循环多少次     但是这种方式是需要两个空间没有尽心重叠,也就是两个不同的空间
//{
//    void* ret=p1;
//    assert(p1 && p2);
//    for(num;num>0;num--)
//    {
//       *(char*)p1=*(char*)p2;//一次就复制一个字节
//        p1=((char*)p1)+1;//也可以改为++(char*)p1,但是循环次数得相应改变
//        p2=((char*)p2)+1;//和上面一样
//    }
//    return ret;
//}
//
//int main(void)
//{
//    int arr1[5]={};
//    int arr2[]={1,2,3,4,5};
//    memcpy(arr1,arr2,sizeof(arr2));

//    struct stu
//    {
//        char name[30];
//        char sex[5];
//        int age;
//    };
//    struct stu stu1={"zhangsan","男",17};
//    struct stu stu2;
//    memcpy(&stu2,&stu1,sizeof(stu1));//前两个参数是地址,后面的参数是需要复制到前面的空间的字节数大小
//    printf("%c\n",stu2.name[0]);

//    my_memcpy(&stu2,&stu1,sizeof(stu1));
//    printf("%s",stu2.name);
//}


3.memove()

 这个函数是用来处理复制的空间如果重叠的情况        void* memmove(void* dest,const void* src,size_t count)
//复制的时候需要考虑空间重叠的情况,如下
//#include<stdio.h>
//#include<memory.h>
//#include<assert.h>

实现memmove     有重叠的情况下总体思路:待移动字符串首地址小于目标空间首地址,从后往前复制,如main函数里面的那个arr1数组,先将5放到7的位置上,然后6放到5的位置上.....
                                   待移动字符串首地址大于目标空间首地址,从前往后复制.
              空间不重叠的情况下:从前往后从后往前都可以
//
//void* my_memmove(void* dest,void* src,size_t count)//dest:目的地   src:源代码,
//{
//    assert(dest && src);
//    void* ret=dest;
//    if(dest<src)//也就是目的地的地址小于源代码的地址        -----举个例子就是将数组后面的元素放到前面
//    {
//        while(count--)
//        {
//            *(char*)dest++=*(char*)src++;//强制类型转换的优先级 大于++的优先级 大于*解引用的优先级  后置++是先解引用在进行++,并且++的是已经强制类型转换后的地址
//        }
//    }
//    else//也就是目的地的地址大于字符串的地址
//    {
//        while(count)
//        {
//            *((char *) dest + count-1 ) = *((char *) src + count-1 );
//            count--;
//        }
//    }
//    return ret;
//}
//
//int main(void)
//{
//    int arr1[9]={1,2,3,4,5,6,7,8,9};
//    int arr2[9]={1,2,3,4,5,6,7,8,9};
//    int i=0;
//
//    memmove(arr1,arr1+2,16);//将3456  移动到 1234的位置上去         没有被覆盖的元素还是会在原来的位置
//    memmove(arr2+2,arr2,16);//将1234  移动到 3456的位置上去
//   for(i=0;i<9 ;i++)
//   {
//       printf("%d ",arr1[i]);
//   }
//   printf("\n");
//   for(i=0;i<9;i++)
//   {
//       printf("%d ",arr2[i]);
//   }
//}



 

4.memcmp()  
内存比较函数   int memcmp(const void* arr1,const void* arr2,size_t num)//最后的参数还是字节数
//里面具体的比较方式和strcmp基本相同,在某一个位置一对字节相比较,arr1>arr2返回大于0的数,小于就返回小于0的数,等于就返回0

//memset()内存设置函数       void* memset(void* dest,int c,size_t num) c其实是设置的字符是什么
//先放参数dest也就是想要修改的空间     再放int c,这c参数可以是字符也可以是数字。也就是想把内存变为这个参数       num经典的字节数
//函数.c里面有,经常用的方式也就是在char[]数组里面
//#include<stdio.h>
//#include<memory.h>
//int main(void)
//{
//    char arr[10];
//    memset(arr,'i',sizeof(arr));
//    arr[9]='\0';
//    printf("%s",arr);
//    return 0;
//}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值