C语言内存函数

简介: 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;


<0 arr1<arr2
0 arr1=arr2
>0 arr1>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;
}


运行结果:



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



结语


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

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

相关文章
|
2天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
26 15
|
2天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
39 24
|
2天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
39 23
|
2天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
15 1
|
1月前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
75 10
|
1月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
59 9
|
1月前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
55 6
|
1月前
|
存储 C语言
【C语言】输入/输出函数详解
在C语言中,输入/输出操作是通过标准库函数来实现的。这些函数分为两类:标准输入输出函数和文件输入输出函数。
319 6
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
69 6
|
8月前
|
存储 C语言
C 语言函数完全指南:创建、调用、参数传递、返回值解析
函数是一段代码块,只有在被调用时才会运行。 您可以将数据(称为参数)传递给函数。 函数用于执行某些操作,它们对于重用代码很重要:定义一次代码,并多次使用。
235 3