在上一节内容中,我们学习了有关字符串操作
的函数,其中分为了限制长度和不限制长度
两种方式,虽然上节内容已经在很大程度上有助于程序的实现,但是其有一个致命的缺陷,聪明的你一定已经猜到了吧,对的,它只能应用于字符串,如果我想要对其他类型数据进行操作就失效了,因此有必要学习内存操作函数
,好了,话不多说,开整!!!
memcpy
查看该函数的使用说明:
可见其传递的参数为void*
,也就是空指针
,没有限定指针类型,所以可以对任何类型的数据都可以进行拷贝
,使用方式如下:
memcpy(目的地,源地址,多少字节)
如下所示的代码:
#include<stdio.h>
#include<string.h>
int main()
{
int sou[] = {1,2,3,4,56};
int des1[10] = {0};
int des2[10] = {0};
strcpy(des1,sou);
memcpy(des2,sou,sizeof(sou));
memcpy(des3,sou,8);
return 0;
}
我们F5
进入调试模式
,先看上节所学习的strcpy能否完成我们的要求呢:
可见strcpy
只将1复制过来了,我们再看内存操作函数memcpy
:
可见,将源地址中的所有数据都复制过来了,下面我们查看只复制8个字节也就是两个整型的des3
的结果:
当然了,你也可以尝试其他类型的数据的拷贝操作,在此处就不一一演示了。
memmove
上述的拷贝都是从不相同的源地址向目的地地址进行拷贝操作的,那么如果源地址与目的地地址所操作的变量为同一内容的情况下
,使用该函数,可不可以得到不想要的效果呢,代码如下:
我们上代码进行验证,代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int arr[] = {1,2,3,4,5,6};
memcpy(arr+2,arr,12);
return 0;
}
同样进行调试模式查看结果:
我去,还真可以,确实是这样,但是实际上在C语言标准中:
memcpy只需能拷贝不重叠的内存就行了
memmove用来拷贝重叠的内存
也就是memcpy太卷了
,不需要你做的你也给我做了,难受。。。
当然了,一个专门处理重叠内存的操作函数,名为memmove,其使用方式如下:
也就是:
memmove(目的地,源地址,移动多少字节的数据)
那么我们将上述代码中的memcpy
函数换为memmove
函数,查看结果:
可以看到也可以实现这个功能,用两幅图来理解这个两个函数也就是:
不卷的情况下,上述的两幅图分别对应memcpy
和memmove
两个函数。
memcmp
在前一节内容中,我们学习了字符串之间比较的函数strcmp
,memcmp
不仅可以比较字符串,也可以比较其他各种类型的变量,其使用方法如下
:
可见,其使用方法如下:
memcmp(目的地地址,源地址,比较多少字节)
其返回值同字符串比较函数strcmp
,如下所示:
比较方式也相同,按顺序进行比较
,例如以下代码:
#include<stdio.h>
#include<string.h>
int main()
{
int arr1[] = {1,2,3,4,56};
int arr2[] = {1,2,1,4,56};
int arr3[] = {1,2,0,4,56};
int res1 = memcmp(arr1,arr1+2,4);
int res2 = memcmp(arr2,arr2+2,4);
int res3 = memcmp(arr3,arr3+2,4);
printf("%d %d %d\n",res1,res2,res3);
return 0;
}
分析如下:
res1:1<3 输出小于0的数;
res2:1=3 输出等于0;
res3:1>0 输出小于0的数
编译查看结果:
确实和我们分析的一致。
memset
该函数是一个设置内存内容
的函数,查看其使用方式:
也即:
memset(要设置哪的位置的地址,设置的内容,设置多少字节)
如以下代码:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "********";
memset(arr,'#',4);
int i = 0;
for(i=0;i<8;i++)
{
printf("%c ",arr[i]);
}
return 0;
}
按照上述的理论,分析如下:
从字符数组arr的首地址开始的4个字节内容设置为#,我们编译一下,查看结果:
可见,确实和我们分析的一致。
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!