一、前言
前面我们已经学习了字符串函数的使用和模拟实现,不过现在字符串函数的使用要告一了。
现在我们学习新的一篇内存函数的(和以前讲的malloc没有一毛钱关系),他们也是隶属于字符
串类型里的(头文件也<string.h>),但是他们的使用方式和字符函数基本不同,所以我就把它们
单独分开来,内存函数的使用单位是内存,所以他没有类型的限制,故他可以设置任意类型的
数据,比字符串函数要好许多,这也是字符串函数的局限性。
二、本节重点
1.memcpy函数的使用和模拟实现
2.memset函数的使用以及注意事项
3.memmove函数的使用和模拟实现
4.memcmp函数的使用和模拟实现
1.memcpy函数(内存拷贝)
函数的参数形式:void*memcpy(void*destination,const void*source,size_t num);
其中num表示的是设置的字节数,注意因为他是无类型的指针,所以在使用之前
必须先强制类型转化,且一般是强制转化为(char*)类型(因为单位是字节)。
memcpy函数的使用:
##include<stdio.h> #include<string.h> int main() { int arr1[20] = { 1, 2, 3, 4, 5, 6 }; int arr2[10] = { 7, 8, 9, 10, 11, 12 }; memcpy(arr1, arr2, 40); for (int i = 0; i < 4; i++) { printf("%d", arr1[i]); } return 0;
memcpy函数的模拟实现
#include<stdio.h> #include<assert.h> void*my_memcpy(void*dest,void*src,size_t num) { assert(dest&&src); char*ret=dest; while(num--) { *(char*)dest=*(char*)src; ++(char*)dest; ++(char*)src; } return ret; } int main() { char arr1[40]={"kong chao yyds"}; char arr2[40]={"yang ying"}; char*kc=my_memcpy(arr1,arr2,9*sizeof(char)); puts(arr1);//或者puts(kc); return 0; }
1.memset函数(内存设置)
函数的参数形式 :
void * memset ( void * ptr, int value, size_t num );
其中ptr是所要设置的起始位置,若是数组则也可以用数组名来代替,value是所要
设置成的内容类型是整形,注但是也可以是字符,因为字符所对应得ascll码值整数,
且字符在存储时也是以ascll的形式存储的。
#include<stdio.h> #include<string.h> int main() { char arr1[10] = { 0 }; memset(arr1, '$', 6); printf("%s", arr1); return 0; }
注意数组的单位是int 还是char如果是char,设置个数*1,int是 设置个数*4
#include<stdio.h> #include<string.h> int main() { int arr1[20] = { 0 }; memset(arr1, 1, 10); for(int i=0;i<10;i++) { printf("%d", *(arr1+i)); } return 0; }
这个代码这个本想设置十个1,但是呢他没看这是int类型,导致他其实只设置了10/4.0=2.5个字节
,所以我们在内存设置的时候要注意数组的类型,这是十分重要的