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;
//}