0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何灵活运用C语言的指针操作

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2022-07-06 15:17 次阅读

作为嵌入式工程师,怎么写出效率高、思路清晰的C语言程序呢?

要用C语言的思维方式来进行程序的构架构建

要有良好的C语言算法基础,以此来实现程序的逻辑构架

灵活运用C语言的指针操作

虽然看起来以上的说法很抽象,给人如坠雾里的感觉,其实就是用C语言进行遇到问题、分析问题和解决问题的过程。

嵌入式工程师在编写C语言程序的时候,要针对遇到的问题进行程序构架构建。

比如我们要处理“猴子选大王”的经典问题:一群猴子,手拉手排成一个圆,从任意一只猴子开始从1开始报数,当遇到要排除的数(预先设定)时该猴子退出该圈,从下一只猴子开始继续从1报数,如此反复,最终剩下的猴子便是猴子的大王。

用C语言的思维方式进行程序构架构建

程序分为三大部分:

a、数据获取,为了程序的运行,上面的问题要获得猴子的总数,从那只猴子开始和剔除的个数;

b、数据运算,需要从一堆数据中剔除相应的数据,注意逻辑的正确;

c、提高程序的运行速率,少用循环多用指针。

用C语言进行逻辑实现

a、 数据获取,通过printf和scanf进行参数的获取。

/* 读入问题条件 */printf("input total num:");scanf("%d", &n);printf("from which num begin:");scanf("%d", &k);if(k>n||k==0){printf("please input the right begin num");return 1; }printf("input the out num:");scanf("%d", &m);if(m>n||m==0){ printf("please input the right del num");return 2; }

同时注意异常时的处理,比如上面两个if语句就是异常情况的判断,每种异常情况对应不同的返回值,这样便于程序过程的调试和数据的合法性。

b、 /* 定义链表节点类型 */

typedef struct node{int data;struct node *next;}linklist;

构建循环链表进行“猴子”的圆圈建设。

515d7896-e645-11ec-ba43-dac502259ad0.png

通过该步骤后,head和p(present)都成了一个“猴子圈”的链表。在该链表的构建过程中需要注意一下几点:内存的开辟,此时遵守使用多少开辟多少的原则。

如果一下开辟过多,会引起内存泄露的问题,但是,这个小程序是不会遇到这种问题了。其次是熟悉循环链表的构建方法:链表的尾巴指向链表的头。这个时候有心的话还会联想到双向链表的情况。

c、 /* 找到第 k 个节点 */

p=head;for (i = 1; i <= k; i++){p = p->next;}

找到从第几个位置开始计数。此时,p指向开始的“猴子”。因为采用了链表方法,这个过程只需要关注p指针的next指向即可。

a、 保存初始的“猴子”圆圈参数。

/* 保存节点总数 */
total = n;printf("
the out num:");q = head;

为什么要保留这个呢?首先要控制猴子数目,所以保留了全部的数目。其次用q(qurry)来保留剔除猴子前面的链表,并连接剔除猴子后的链表。这样,完成了循环链表的元素删除。

b、 猴子查数。

猴子查数是整个程序的关键,需要完成以下任务:a、找到开始的“猴子”数;b、删除该“猴子”;c、将删除掉的循环链表首尾连接起来。

/* 只剩一个节点时停止循环 */while (total != 1){/* 报数过程,p指向要删除的节点 */for (i = 1; i < m; i++){p = p->next;}/* 打印要删除的节点序号 */printf("[%d] ", p->data);/* q 指向 p 节点的前驱 */while (q->next != p){q = q->next;}/* 删除 p 节点 */q->next = p->next;/* 保存被删除节点指针 */s = p;/* p 指向被删除节点的后继 */p = p->next;/* 释放被删除的节点 */free(s);/* 节点个数减一 */total--;}/* 打印最后剩下的节点序号 */printf("

the last num:[%d] 

", p->data);free(p);}

通过以上数据运算,可以完成相应链表元素的删除,这或许就是C语言程序的魅力所在。

使用C语言的指针

比如本程序的链表指针的定义,p,s,q。

linklist *head, *p, *s, *q;

我们知道,指针操作不但可以减少数据操作需要的内存,还可以提高程序的运行速度。

指针的优势,或许在本程序中表现的不明显,在大量数据和对操作速度要求比较敏感的情况下会很明显,比如Linux内核中,就会有很好的体现。

总之,对于嵌入式工程师,不但能设计出好的硬件电路,如果也能写出好的软件程序就会让我们的生活更加美好。

原文标题:嵌入式工程师,用好C语言这一利器的三要素

文章出处:【微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7085

    浏览量

    89233
  • C语言
    +关注

    关注

    180

    文章

    7608

    浏览量

    137177
  • 硬件电路
    +关注

    关注

    39

    文章

    244

    浏览量

    29259

原文标题:嵌入式工程师,用好C语言这一利器的三要素

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言程序设计教程第4版第8讲:指针

    C语言指针讲解
    发表于 11-20 14:10 0次下载

    C语言指针学习笔记

    本文从底层内存分析,彻底让读者明白C语言指针的本质。
    的头像 发表于 11-05 17:40 266次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>指针</b>学习笔记

    C语言指针运算符详解

    C语言中,当你有一个指向数组中某个元素的指针时,你可以对该指针执行某些算术运算,例如加法或减法。这些运算可以用来遍历数组中的元素,如ptr[i]等价于*(ptr + i)。然而,如果
    的头像 发表于 10-30 11:16 273次阅读

    如何在Excel中灵活运用SUMIF函数

    。 criteria :定义哪些单元格将被加总的条件。 sum_range :(可选)实际要加总的单元格区域。如果省略, range 将被用作 sum_range 。 示例: 假设你有一个销售数据表,A列是日期,B列是产品名称,C列是销售额。你想
    的头像 发表于 10-30 09:53 361次阅读

    C语言与其他编程语言的比较

    C语言作为一种历史悠久的编程语言,自其诞生以来,一直在软件开发领域扮演着重要角色。它以其高效、灵活和可移植性强的特点,成为了系统级编程的首选语言
    的头像 发表于 10-29 17:30 312次阅读

    C语言指针详细解析

    可以对数据本身,也可以对存储数据的变量地址进行操作指针是一个占据存储空间的实体在这一段空间起始位置的相对距离值。在C/C++语言中,
    发表于 09-14 10:03

    面试中的高频问题:指针函数与函数指针,你能完美应对吗?

    一直觉得C语言较其他语言最伟大的地方就是C语言中的指针,有些人认为
    的头像 发表于 06-22 08:11 1765次阅读
    面试中的高频问题:<b class='flag-5'>指针</b>函数与函数<b class='flag-5'>指针</b>,你能完美应对吗?

    Keil+C51中对双数据指针的直接利用

    Keil+C51中对双数据指针的直接利用
    发表于 06-18 10:15 0次下载

    提高C代码可读性的编写技巧与策略

    指针C 语言的灵魂,是 C 比其他语言灵活,更强大的地方。所以学习
    发表于 04-23 18:25 531次阅读

    C语言函数指针六大应用场景详解

    函数指针是一种非常强大的编程工具,它可以让我们以更加灵活的方式编写程序。在本文中,我们将介绍 6 个函数指针的高级应用场景,并贴出相应的代码案例和解释。
    的头像 发表于 04-23 18:19 910次阅读

    CCLink转EtherCAT网关在制袋机生产中的灵活运用

    在制袋机生产中,为了实现高效、精准的控制,许多厂家开始采用工业互联网技术。其中,开疆CCLink转EtherCAT网关成为了实现这一目标的关键设备。本文将详细介绍CCLink转EtherCAT网关在制袋机生产中的灵活运用
    的头像 发表于 03-26 17:30 577次阅读
    CCLink转EtherCAT网关在制袋机生产中的<b class='flag-5'>灵活运用</b>

    CCLink转EtherCAT网关在制袋机生产中的灵活运用

    在制袋机生产中,为了实现高效、精准的控制,许多厂家开始采用工业互联网技术。其中,开疆CCLink转EtherCAT网关成为了实现这一目标的关键设备。本文将详细介绍CCLink转EtherCAT网关在制袋机生产中的灵活运用
    的头像 发表于 03-26 17:29 490次阅读
    CCLink转EtherCAT网关在制袋机生产中的<b class='flag-5'>灵活运用</b>

    C语言基础-为什么要使用C

    当今最流行的 Linux 操作系统和 RDBMS(Relational Database Management System:关系数据库管理系统) MySQL 都是使用 C 语言编写的。
    发表于 03-25 11:20 460次阅读

    C语言指针用法

    C语言编程中善用指针可以简化一些任务的处理,而对于一些任务(比如动态内存分配),必须要有指针才行的。也就是说精通C
    发表于 03-05 14:22 369次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>指针</b>用法

    c语言,c++,java,python区别

    C语言C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言
    的头像 发表于 02-05 14:11 2476次阅读