C 语言中函数的高效学习方法实操在内存函数中

必看:C语言高效学习方法(附经典试题详解) C试题100例详解专栏写在前面正片开始:问题描述课题分析算法描述自然语言方式描述流程图方式描述源代码试验结果分析与讨论 写在前面 本专栏提供多于100道C试题解答,并且会一直不定期更新,使用的过程中如果有看不懂的地方,可以通过扫描文章末尾的公众号免费向我寻求解答。如果在做题的过程中有遇到专栏中没有的题目,也欢迎向我寻求解答,我将尽力为你解答! 正片开始: 问题描述 请编写一个函数,函数功能是删除字符串中的所有空格,例如,主函数中输入”asd af aa z67”,则输出为”asdafaaz67”. 课题分析 阅读详情

在 C 语言我们学习了字符串的一系列操作,比如拷贝,比较等一系列的操作,那么是否有更加全面的函数呢,现在我们来学习直接通过内存访问来操作一些数据的函数

首先我提出一些学习方法,在 C 语言库中有许许多多的函数,而很多同学觉得有些函数过两天就忘了,分享一下我在学习各种很重要的函数时一些实用性很强的学习建议

1.关注函数的类型,返回类型,参数类型,参数名,参数个数、

2.关注函数的作用,通过作用来更好的理解函数的各种参数和返回类型,例如 strstr 函数,这个函数是寻找子串,所以参数肯定至少有两,一个待查找串,一个模板串,而且是查找,所以找到了会返回一个地址,那这个函数的返回类型就是 char*

3.手动的去实现一些函数,例如上节博客的字符串函数,以及这节的内存操作函数,手动去实现,不仅仅可以增加我们对函数的认识,还可以从中获取一些,操作的算法,甚至能学习到指针的实现过程,这是极大的学习函数和算法,逻辑的宝贵途径

1.Memcpy

内存拷贝函数,这个函数是处理内存不重叠时所使用的,如有内存重叠,在同一块内存上,我们应该使用 memmove 函数,下面我给出这个函数的类型

void * memcpy(void *dest,void *src,size_t num)

返回类型是泛型指针void*,也代表了这个函数可以进行各种数据的操作,返回拷贝内容的起始地址dest,后面的参数 size_t  num 指的是拷贝的字节大小,整体的功能是将 src里的内容拷贝到 dest 里并返回 dest 的地址

下面,我给出这个函数的模拟实现

void * my_memcpy(void * dest,void * src,size_t num)
{
    void * ret = dest;//保留起始位置,方便返回
    assert(dest && src);
    while(num--)//循环num 次,按字节交换
    {
        *(char *)dest = *(char *)src;
        dest = (char *)dest +1;
        src = (char*)src + 1;    
    }
    return ret;
}

2.Memmove

这个函数与上一个函数的功能更加强大,可以处理带有内存重叠的拷贝

void * memmove(void *dest,void *src,size_t num)

比如,当有一个数组,需要在数组内部实现拷贝且带有内存的重叠时,就可以使用这个函数

给出这个函数的模拟实现

void * my_memmove(void * dest,void*src,size_t num)
{
    void * ret = dest;
    assert(dest && src);
    if((char *)dest < (char *)src)
    {
        while(num--)//从前向后拷贝
        {
            *(char*)dest = *(char*)src;
            dest = (char *)dest +1;
            src = (char *)src +1;
        }
    }
    else
    {
        while(num--)//从后向前拷贝
        {
            *((char *)dest+num) = *((char *)src +num);        
        }

    }
    return ret;
}

2.实现原理

注意,这个函数内部的实现思想是重要的,在后续实现顺序表时,就会用到这种,怎样拷贝才不会让值覆盖,所以,对这个函数的内部实现清楚,是让自己能力提升的重要因素

我来讲解一下这个函数

在 memcpy 中,我们没有关心 dest 与 src 的位置前后问题,试想,如果 dest 在 src 后面,我们在从src 的开始地址复制时,值就会被覆盖,比如 dest 在[4],src在[2],我们要向后拷贝两个单位,

比如从 下标为 2 开始往后复制三个单位到下标为 3 的数据,2->3,3->4,注意,当 3 拷贝到 4 时,3 已经被 2 的值覆盖了,所以 4 也是 2 的值,此时就发现了问题,我们的模拟实现是有问题的,所以我们要分情况,在这种情况下,我们应该从后往前开始拷贝,在代码中就体现在以下地方

按 dest 和 src 的位置前后分类,当 dest 在 src 前面时,我们应该从前往后复制,当 dest 在 src 后面时,我们应该从后往前复制,我对此总结为:

前前后后,即当dest 在 src 前面时,从前往后复制,当 dest 在 src 后面时,从后往前复制

3.Memset

这个函数的功能类似于初始化一组数据,但在运用时有局限,以下是函数定义

void * memset ( void * ptr, int value, size_t num );

有三个参数,第一个指针指向待开始的设置的数据,第二个参数是改变后的元素,第三个是设置多少个字节。下面给出模拟实现

void *my_memset(void *s, int c, size_t n) {
    if (s == NULL) return s;
    
    unsigned char *p = (unsigned char *)s;
    unsigned char uc = (unsigned char)c;
    
    // 指针遍历
    while (n--) {
        *p++ = uc;
    }
    
    return s;
}

但注意,此函数在使用时是有局限的,例如在此时

当设置的元素是整形时,一个整形是四个字节,而 memset 是按字节去填充内容,那么在一个整形内就会填充四次,填充完之后,那这个整形早已不是我们所期望的目标整形,当然也并不是所有整形都不行,当设置元素为 0 时,就可以解决这个问题。

好了,到现在我们重要的内存操作讲解就已经完毕了,在我讲解时,都采取了我一开始总结的学习函数的方法,关注函数的返回类型和各个参数,关注函数的作用,关注函数的模拟实现,相信你如果以后按照这种思想学习函数时,会对函数的使用了如指掌。

                                                                                          以上纯个人观点,如有不足,大家补充

手把手教你用STM32+LAN8720搭建以太网通信模块(含原理图) 本文详细介绍了如何使用STM32微控制器与LAN8720物理层芯片搭建以太网通信模块,涵盖硬件设计、软件配置及常见问题排查。重点讲解了LAN8720的低功耗设计、RMII接口简化布线等特性,以及STM32CubeMX配置和LwIP协议栈移植技巧,助力开发者快速实现稳定可靠的嵌入式网络通信。 阅读详情

相关推荐

Isaac Gym摄像头数据获取全攻略:从CPU到GPU,教你实时显示RGB与深度图

本文详细介绍了在Isaac Gym中获取摄像头数据的两种高效方案:CPU模式与GPU张量模式。通过实战代码示例,展示了从摄像头配置、数据获取到实时可视化RGB与深度图的全流程,帮助开发者优化机器人仿真与计算机视觉应用的性能。特别强调了GPU模式下的零拷贝访问与张量运算优势,适用于需要低延迟处理的场景。

weixin_29056701的博客 388

C语言内存操作函数

比如对于内存的复制,内存的设置以及内存的比较,这些函数都是针对内存块来处理的,为程序员提供了更加安全,高效和灵活的方式,让程序员能够对内存进行各种常见的操作和处理,下面就让我们来详细了解一下吧。但是可能细心的同学会发现,我们就算使用memcpy函数也能够实现重叠部分的程序运算,但是我们在C语言中更推荐规范使用,如果有重叠部分的就使用memmove函数,虽然我们在VS的编译器上用memcpy来处理重叠部分可以成功,但是在其他编译器上却不一定,所以我们尽量的规范使用。memmove函数可以处理重叠部分。

OKkankan的博客 3610

阿里天池新闻推荐实战:多路召回策略解析与优化

本文深入解析阿里天池新闻推荐项目中的多路召回策略,包括ItemCF、UserCF、YouTubeDNN等五种召回模型的协同应用与优化技巧。通过实战案例展示如何提升推荐系统效果,特别针对冷启动问题提出创新解决方案,帮助开发者构建高效的新闻推荐系统。

weixin_26918763的博客 415

【c 语言 】malloc函数详解

本文将详细解析malloc函数的功能、工作步骤、语法、使用方法以及注意事项,帮助读者更好地理解和应用这一强大的内存管理工具

m0_74195174的博客 3万+

利用LDA进行主题建模,用困惑度和一致性曲线选取最优主题数

如果困惑度和一致性曲线效果图较好,确定了主题数量后,再单独跑一下2里面的程序。2中topic为5是我主观设置的,不一定为最优。

m0_56327159的博客 4223

【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法

相比C文本类编程语言,Simulink图形化编程语言的优势是逻辑思路和数据流清晰了很多,劣势是程序执行的时序不明确,而且各个模块的配置使编程的灵活度下降了不少,在使用习惯上面总感觉有各种限制。本文就是拆解Simulink中最基础的几个编程模块,发扬它的优势,避开劣势。

Mr.Cssust的博客 3851

【C语言】内存函数

本文深入解析C语言中四个核心内存操作函数:memcpy、memmove、memset和memcmp。memcpy实现基础内存拷贝但不处理重叠内存;memmove是其增强版,支持内存重叠场景;memset按字节设置内存值;memcmp按字节比较内存内容。文章通过函数说明、实用示例和模拟实现三个维度,详细讲解各函数的特点和使用场景,帮助读者掌握C语言内存操作的精髓,避免常见陷阱。理解这些函数的底层实现逻辑,能更好地运用C语言"直面内存"的特性进行高效开发。

2301_78257800的博客 1383

个人量化系统的策略集合与赚钱之道:全栈深度解析 + 与主流开源框架对比

前三篇把系统的"骨架"拆完了——架构、工程化、部署。本篇回答最关键的问题:一句话:别人的系统是"程序员的系统"(写代码才能加策略),daily_stock_analysis 是"股民的 YAML"(写中文就能加策略)。这个差异决定了它能在多大程度上真的帮你赚钱。如果你用过 、、,加一个策略的流程是: 问题在哪?在 daily_stock_analysis 里,“策略” = 一个文件。每个 YAML 是一个自然语言描述的交易策略,包括: 看到没? ——整个策略就是一段中文,零代码。任何会写字的人都能加新策略

shiter编写程序的艺术 156

C语言内存函数超详解

1. memcpy 1. 1 memcpy 的使用 1. 2 memcpy 的模拟实现 2. memmove 2. 1 memmove 使用 3. memset 3. 1 memset 函数的使用 3. 2 memset 的模拟实现 4. memcmp 4. 1 memcmp 函数的使用 4. 2 memcmp 的模拟实现

fhvyxyci的博客 2525

UE5实现物体高亮描边效果(含UE相关源码浅析)

UE5实现物体高亮描边效果

专注GIS开发 7334

2025华为杯第二十二届中国研究生数学建模竞赛A题:通用神经网络处理器下的核内调度问题 - 完整解题分析+完整MATLAB源码!

🎓 本文收录于 《滚雪球学数学建模》专栏,本专栏专注于从零基础出发,带你循序渐进掌握数学建模的核心方法与思维路径。通过“滚雪球式”学习法,从最简单的生活化案例到经典建模工具,再到省赛、国赛真题实战演练,逐步积累知识与技能,帮助你搭建完整的建模体系。无论你是刚接触建模的新生,还是希望提升科研与竞赛能力的学者与工程师,本专栏都将为你提供一条清晰、高效、可实操的建模成长路线,助力你快速进阶,突破难点,迈向数学建模竞赛与实际应用的更高峰 🚀!

**My Coding Family** 2053

C语言内存函数

在C语言编程中,内存操作函数如memcpymemmovememset和memcmp是处理内存数据的基础工具。它们提供了对内存块进行复制、移动、设置和比较的功能,使得程序能够高效地操作大块数据。然而,尽管这些函数看似简单,其底层实现却蕴含着许多巧妙的优化和细节。本篇博客将详细介绍这些内存操作函数的使用方法,并通过模拟实现来剖析它们的内部机制。通过对比不同实现方式的效率和安全性,读者可以更好地理解这些函数的工作原理,避免在实际编程中可能遇到的陷阱和问题。memcpy是一个强大且高效的函数,用于内存复制操作。

m0_73605503的博客 2198

《Java开发及前端最全面试题-Offer直通车》目录

Java开发是需求最广,工资高的细分领域,同时也是会的人最多,有的公司招1个Java开发,要面试几十甚至上百面试者,同时要求很高,要求通晓技术栈很多及很深深度。如果你正准备面试,想要脱颖而出,那么《Java开发及前端最全面试题-Offer直通车》是你的不二选择。本书汇集了多篇超过1万字的精华内容,无论是Java基础、数据库、SpringBoot和SpringCloud等必问的,还是前端、k8s等容器和虚拟化和大数据各类技术面试,本书都为你提供了最全面的试题和参考答案。

大模型大数据攻城狮的专栏 1178

C语言高效学习、提升方法

C语言高效学习、提升方法 C语言怎么学习、提升最快呢?个人觉得还是要从框架上去着手学习,用全局眼光去看、去学,主要是三部分:关键字及基本语法、重点功能点及标准库函数;只要把这三部分基本搞懂了,剩下就就是去刻意练习与项目实践,更熟练也就更精通,也就能写出架构更合理、更精妙的程序~

热土程序园,利他愉己~ 3002

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c语言内存库函数

memcpy、memmove、memset和memcmp是C语言中常用的内存操作函数。memcpy用于内存块的复制,不支持重叠区域;memmove功能类似但支持重叠内存处理;memset用于内存初始化,按字节设置指定值;memcmp则比较两个内存块的内容。这些函数都需包含string.h头文件,通过指针操作实现跨数据类型处理,使用时需注意参数类型和边界条件。文章提供了各函数的使用示例和模拟实现方法,帮助理解其底层工作原理。

2302_81017491的博客 1916

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C语言memset函数详解:高效初始化内存的利器

memset函数是C语言中高效操作内存的利器,广泛用于数组、结构体和动态内存的初始化。通过合理设置缓冲区大小和字节值,memset可以快速清零或填充内存,显著提高程序效率。然而,开发者需注意其字节级操作特性,避免对多字节类型设置非零值导致的错误。希望本文能帮助你深入理解memset函数的用法和注意事项!在实际开发中,结合sizeof和错误检查,memset将成为你处理内存初始化的得力助手。如果有更多关于C语言内存操作的问题,欢迎随时探讨!

weixin_52734695的博客 3021

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言王国——内存函数

如果destination为source+1,num为12则,当source中的1赋值到destination上的2时,就导致了source中的2也变成了1,导致拷贝结果不对,这就是堆叠。

姜糖的博客 2268

【C语言】内存操作函数完全指南!!!

本文深入解析了C语言中四大内存操作函数:memcpy、memmove、memset和memcmp。首先探讨了memcpy的基本使用和模拟实现,指出其在内存重叠时的未定义行为;接着详细分析了memmove函数如何安全处理内存重叠问题,并给出了完整的模拟实现方案;然后介绍了memset函数的使用方法和常见误区;最后讲解了memcmp函数的内存比较功能。通过原理分析、使用示例和模拟实现,帮助开发者掌握高效安全的内存操作技巧,特别针对内存重叠等复杂场景提供了实用解决方案。

suxi_na的博客 1360

【C语言】C语言学习教程

 C 语言的应用领域极其广泛。在操作系统开发领域,大名鼎鼎的 Linux 操作系统,其内核大部分代码就是用 C 语言编写的。Windows 操作系统的底层核心部分,同样离不开 C 语言的支持。这是因为 C 语言能够直接操作硬件资源,对内存和 CPU 的控制精准高效,能够充分发挥硬件的性能,为操作系统的稳定运行提供坚实保障。

大雨淅淅的博客 2317

C语言高效内存管理:对齐、缓存与位域

内存对齐(Memory Alignment)是指数据在内存中存储时,其起始地址遵循特定的规则,使得数据能够被高效地访问。CPU通常以固定的字节数(对齐边界)读取内存数据,未对齐的数据访问可能导致性能下降或硬件异常。 对齐边界:数据类型的大小通常决定了其对齐边界。例如,4字节(32位)的`float`通常要求4字节对齐,8字节(64位)的`double`要求8字节对齐。

rm -rf/坏习惯 2322

C语言 内存函数

C语言 内存函数一、内存复制函数1.1 memcpy函数1.2 memmove函数二、内存比较函数 memcmp三、内存查找字符函数 memchr四、内存设置函数 memset 前言:C语言提供了许多与内存相关函数,可以在头文件<string.h>中查看函数声明,本章将会自行编写相关内存函数 一、内存复制函数 1.1 memcpy函数 功能: 将num字节的值从source指向的位置直接拷贝到destination指向的内存块,该函数不检查源中是否有’\0’字符——它总是精确地复制num字节。但

kjl167的博客 1630

C语言库函数 — 内存函数(含模拟实现内存函数)

内存操作函数是一类计算机程序设计中的函数库,旨在提供对内存进行常见操作的函数 本期介绍内存函数memcpy()、memmove()、memcmp()、memset() C语言模拟实现memcpy、memmove、memcmp、memset

小黄鸭的博客 1054

C语言:内存函数

在上一篇博客我们了解了字符函数和字符串相关的函数,都是用来对字符串进行各种常用操作的函数,如果我们想要将这些函数扩大作用范围,只靠这些函数是远远不够的,因为这些函数是专门针对字符串的。那C语言中有没有函数能针对进行类似字符串函数的函数呢?答案是肯定有的,接下来我将以这篇博客一一向大家介绍。

2302_80177865的博客 871

【C语言动态内存管理】—— 智能分配与精准释放之道,打造高效内存循环

想要精通 C 语言?动态内存管理是关键一课!malloc 与 calloc 如何精准分配内存?realloc 扩容时原地与异地有何乾坤?返回值怎样妥善处置?本文一一拆解。更有 free 守护内存净土,杜绝泄漏风险;剖析越界、重复释放陷阱,筑牢安全防线。柔性数组携高效便捷之姿,闪耀动态数据舞台。汲取本文精华,构建稳固动态内存框架,照亮通往编程大师殿堂的幽径!

bite_zwy的博客 1650

C语言怎么系统化的高效学习?

今天给大家分享一个学习路线,也算是给这段时间C语言系列的一个总结,大家按图索骥,能够飞快的掌握C语言。C语言指针很难学?给你最直接的解决思路!首先我想说下,C语言是非常重要的语言。为什么这...

程序员入门进阶 2518

C语言memmove函数详解:安全高效的内存复制利器

memmove函数是C语言中安全高效的内存复制工具,特别适合处理源和目标内存重叠的场景。通过合理管理缓冲区大小和指针,memmove可以在数组操作、动态内存管理、结构体复制和环形缓冲区等场景中发挥重要作用。相比memcpymemmove的通用性使其成为更安全的选择。希望本文能帮助你深入理解memmove函数的用法和注意事项!在实际开发中,结合sizeof和指针检查,memmove将成为你处理内存操作的得力助手。如果有更多关于C语言内存管理的问题,欢迎随时探讨!

weixin_52734695的博客 1905
上一篇: 深度剖析C语言中字符串函数的坑点与细节,并且总结归纳
下一篇: 从 0->1 的用C语言手搓基于顺序表的通讯录项目(优化版)
DDXYcoder
博客等级 码龄1年 140粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值