C语言内存函数

内存函数!!!

c语言中有专门对字符串使用的函数,比如strcpy(字符串拷贝),strcat(字符串追加),strcmp(字符串比较),strstr(在一个字符串中查找另一个字符串)等等,那么c语言不能这么偏心呀,有没有对其它类型可以使用的函数呢?那就要说到我们的内存函数

顾名思义,内存函数可以针对内存中的数据进行一定的小操作,这时候就不管你是什么类型了,

都要给我乖乖听话,我们先简单介绍四个内存函数:

memcpy  memmove   memset   memcmp

1:memcpy

memcpy 的作用是进行数据拷贝,将一个数组的内容拷贝到指定的数组内

void * memcpy ( void * destination, const void * source, size_t num )

memcpy 函数有两个参数 ,destination也就是存放拷贝内容的地址,source是存放初始内容的地址,就是把source地址指向的数据拷贝到destination地址指向的数据中

因为这个函数可以对任意类型的数据使用,所以定义成 void* 类型的指针,num是拷贝数据的大小,单位是字节,定义成size_t类型,memcpy的返回类型是void*,其实细心思考一下就知道为什么返回void*了。

memcpy的使用

#include<stdio.h>
#include<string.h>
int main()
{
    int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int arr2[10] = { 0 };
    int i = 0;

    memcpy(arr2, arr1, 5 * sizeof(int));
    for (i = 0; i < 10; i++)
    {
        printf("%d ",arr2[i]);
    }
    return 0;
}

 

可以清晰地看到arr2数组内的值被改变了

温馨提示

  使用内存函数前别忘了加头文件哦(#include<string.h>) 

其实我们是可以在arr2中任意位置放入拷贝的数据,也可以拷贝arr1中任意位置的数据,

前提是不能越界访问且一定是连续的

memcpy的模拟实现

#include<stdio.h>

#include<string.h>

#include<assert.h>

void* my_memcpy(char* p1, char* p2, size_t num)

{

void* ret = p1;

assert(p1 && p2);

while (num--)

{

*((char*)p1) = *((char*)p2);

(char*)p1 = (char*)p1 + 1;

(char*)p2 = (char*)p2 + 1;

}

return ret;

}

int main()

{

int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

int arr2[10] = { 0 };

my_memcpy(arr2+3, arr1, 20);

int i = 0;

for (i = 0; i < 10; i++)

{

printf("%d ", arr2[i]);

}

return 0;

}

因为memcpy中第三个参数是拷贝数据的大小,单位是字节,所以模拟函数内用char*类型来交换。

2:memmove

那要是拷贝一个数组中的数据,还是放在这个数组中,内存发生重叠怎么办呢?

这就用到memmove函数了,memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

memmove的使用

#include<stdio.h>
#include<string.h>
int main()
{
    int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int i = 0;

    memmove(arr1, arr1+5, 5 * sizeof(int));
    for (i = 0; i < 10; i++)
    {
        printf("%d ",arr1[i]);
    }
    return 0;
}

 memmove的模拟实现

void* my_memmove(char* p1, char* p2, size_t num)

{

void* ret = p1;

assert(p1);

assert(p2 );

if (p1 < p2)

{

while (num--)

{

*((char*)p1) = *((char*)p2);

(char*)p1 = (char*)p1 + 1;

(char*)p2 = (char*)p2 + 1;

}

}

else

while (num--)

{

*((char*)p1 + num) = *((char*)p2 + num);

}

return ret;

}

int main()

{

int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

int arr2[10] = { 0 };

my_memmove(arr1, arr1+5, 20);

int i = 0;

for (i = 0; i < 10; i++)

{

printf("%d ", arr1[i]);

}

return 0;

}

memcpy相比,只是多了内存重叠的数据拷贝,

有两种情况:

 第一种方式就是memcpy的拷贝方式,这里不再多说;

第二种方式是从后往前拷贝,可以看一下代码实现方式:

while (num--)

{

*((char*)p1 + num) = *((char*)p2 + num);

}

p1+num,从最后的地址开始拷贝,然后 num--, num=0 while 循环结束。

3:memset

memset 是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容,
void * memset ( void * ptr, int value, size_t num );

 第二个参数表示要设置的值,以int 形式传递, 如果值超过了无符号char的最大值,就会把该值转换成无符号char能存的下的值再写到内存里,

希望大家能够理解,例如

300无符号char类型中存放的是44,

例如:
# include <stdio.h>
# include <string.h>
int main ()
{
char str[] = "hello world" ;
memset (str, 'x' , 6 );
printf (str);
return 0 ;
}

 输出结果:

xxxxxxworld

4:memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

这个就很好理解了,比较两个数据的大小

假设有两个数组:arr1,arr2;

<0arr1<arr2
0arr1=arr2
>0arr1>arr2

例子:

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "abcdefg";
    char arr2[] = "abcdefh";
    int n;
    n = memcmp(arr1,arr2, sizeof(arr1));
    if (n > 0)
        printf("大于\n");
    else if (n < 0)
        printf("小于\n");
    else
        printf("等于\n");
    return 0;
}

运行结果:

 把字符串换成整形也是可以的

结语

这里四个函数也介绍完了,希望给你们带来帮助!

(草草结语,实在是内心烦躁,看完的话点个赞吧)

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值