C语言学习(二十九)---内存操作函数

在上一节内容中,我们学习了有关字符串操作的函数,其中分为了限制长度和不限制长度两种方式,虽然上节内容已经在很大程度上有助于程序的实现,但是其有一个致命的缺陷,聪明的你一定已经猜到了吧,对的,它只能应用于字符串,如果我想要对其他类型数据进行操作就失效了,因此有必要学习内存操作函数,好了,话不多说,开整!!!

memcpy

查看该函数的使用说明:
C语言学习(二十九)---内存操作函数_第1张图片
可见其传递的参数为void*,也就是空指针,没有限定指针类型,所以可以对任何类型的数据都可以进行拷贝,使用方式如下:

memcpy(目的地,源地址,多少字节)

如下所示的代码:

#include
#include
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能否完成我们的要求呢:
C语言学习(二十九)---内存操作函数_第2张图片
可见strcpy只将1复制过来了,我们再看内存操作函数memcpy
C语言学习(二十九)---内存操作函数_第3张图片
可见,将源地址中的所有数据都复制过来了,下面我们查看只复制8个字节也就是两个整型des3的结果:
C语言学习(二十九)---内存操作函数_第4张图片
当然了,你也可以尝试其他类型的数据的拷贝操作,在此处就不一一演示了。

memmove

上述的拷贝都是从不相同源地址向目的地地址进行拷贝操作的,那么如果源地址与目的地地址所操作的变量为同一内容的情况下,使用该函数,可不可以得到不想要的效果呢,代码如下:

我们上代码进行验证,代码如下:

#include
#include
int main()
{
    int arr[] = {1,2,3,4,5,6};
    memcpy(arr+2,arr,12);
    return 0;
}

同样进行调试模式查看结果:
C语言学习(二十九)---内存操作函数_第5张图片
我去,还真可以,确实是这样,但是实际上在C语言标准中:

memcpy只需能拷贝不重叠的内存就行了
memmove用来拷贝重叠的内存

也就是memcpy太卷了不需要你做的你也给我做了,难受。。。
当然了,一个专门处理重叠内存的操作函数,名为memmove,其使用方式如下:
C语言学习(二十九)---内存操作函数_第6张图片
也就是:

memmove(目的地,源地址,移动多少字节的数据)

那么我们将上述代码中的memcpy函数换为memmove函数,查看结果:
C语言学习(二十九)---内存操作函数_第7张图片
可以看到也可以实现这个功能,用两幅图来理解这个两个函数也就是:
C语言学习(二十九)---内存操作函数_第8张图片
C语言学习(二十九)---内存操作函数_第9张图片
不卷的情况下,上述的两幅图分别对应memcpymemmove两个函数。

memcmp

在前一节内容中,我们学习了字符串之间比较的函数strcmpmemcmp不仅可以比较字符串,也可以比较其他各种类型的变量,其使用方法如下

在这里插入图片描述
可见,其使用方法如下:

memcmp(目的地地址,源地址,比较多少字节)

返回值同字符串比较函数strcmp,如下所示:
C语言学习(二十九)---内存操作函数_第10张图片
比较方式也相同按顺序进行比较,例如以下代码:

#include
#include
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

该函数是一个设置内存内容的函数,查看其使用方式:
C语言学习(二十九)---内存操作函数_第11张图片
也即:

memset(要设置哪的位置的地址,设置的内容,设置多少字节)

如以下代码:

#include
#include
int main()
{
    char arr[] = "********";
    memset(arr,'#',4);
    int i = 0;
    for(i=0;i<8;i++)
    {
        printf("%c ",arr[i]);
    }
    return 0;
}

按照上述的理论,分析如下:
从字符数组arr的首地址开始的4个字节内容设置为#,我们编译一下,查看结果:
在这里插入图片描述
可见,确实和我们分析的一致。

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

你可能感兴趣的:(C语言学习,c语言,学习,开发语言)