0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何靈活運(yùn)用C語(yǔ)言的指針操作

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 作者:STM32嵌入式開(kāi)發(fā) ? 2022-07-06 15:17 ? 次閱讀

作為嵌入式工程師,怎么寫(xiě)出效率高、思路清晰的C語(yǔ)言程序呢?

要用C語(yǔ)言的思維方式來(lái)進(jìn)行程序的構(gòu)架構(gòu)建

要有良好的C語(yǔ)言算法基礎(chǔ),以此來(lái)實(shí)現(xiàn)程序的邏輯構(gòu)架

靈活運(yùn)用C語(yǔ)言的指針操作

雖然看起來(lái)以上的說(shuō)法很抽象,給人如墜霧里的感覺(jué),其實(shí)就是用C語(yǔ)言進(jìn)行遇到問(wèn)題、分析問(wèn)題和解決問(wèn)題的過(guò)程。

嵌入式工程師在編寫(xiě)C語(yǔ)言程序的時(shí)候,要針對(duì)遇到的問(wèn)題進(jìn)行程序構(gòu)架構(gòu)建。

比如我們要處理“猴子選大王”的經(jīng)典問(wèn)題:一群猴子,手拉手排成一個(gè)圓,從任意一只猴子開(kāi)始從1開(kāi)始報(bào)數(shù),當(dāng)遇到要排除的數(shù)(預(yù)先設(shè)定)時(shí)該猴子退出該圈,從下一只猴子開(kāi)始繼續(xù)從1報(bào)數(shù),如此反復(fù),最終剩下的猴子便是猴子的大王。

用C語(yǔ)言的思維方式進(jìn)行程序構(gòu)架構(gòu)建

程序分為三大部分:

a、數(shù)據(jù)獲取,為了程序的運(yùn)行,上面的問(wèn)題要獲得猴子的總數(shù),從那只猴子開(kāi)始和剔除的個(gè)數(shù);

b、數(shù)據(jù)運(yùn)算,需要從一堆數(shù)據(jù)中剔除相應(yīng)的數(shù)據(jù),注意邏輯的正確;

c、提高程序的運(yùn)行速率,少用循環(huán)多用指針。

用C語(yǔ)言進(jìn)行邏輯實(shí)現(xiàn)

a、 數(shù)據(jù)獲取,通過(guò)printf和scanf進(jìn)行參數(shù)的獲取。

/* 讀入問(wèn)題條件 */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; }

同時(shí)注意異常時(shí)的處理,比如上面兩個(gè)if語(yǔ)句就是異常情況的判斷,每種異常情況對(duì)應(yīng)不同的返回值,這樣便于程序過(guò)程的調(diào)試和數(shù)據(jù)的合法性。

b、 /* 定義鏈表節(jié)點(diǎn)類型 */

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

構(gòu)建循環(huán)鏈表進(jìn)行“猴子”的圓圈建設(shè)。

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

通過(guò)該步驟后,head和p(present)都成了一個(gè)“猴子圈”的鏈表。在該鏈表的構(gòu)建過(guò)程中需要注意一下幾點(diǎn):內(nèi)存的開(kāi)辟,此時(shí)遵守使用多少開(kāi)辟多少的原則。

如果一下開(kāi)辟過(guò)多,會(huì)引起內(nèi)存泄露的問(wèn)題,但是,這個(gè)小程序是不會(huì)遇到這種問(wèn)題了。其次是熟悉循環(huán)鏈表的構(gòu)建方法:鏈表的尾巴指向鏈表的頭。這個(gè)時(shí)候有心的話還會(huì)聯(lián)想到雙向鏈表的情況。

c、 /* 找到第 k 個(gè)節(jié)點(diǎn) */

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

找到從第幾個(gè)位置開(kāi)始計(jì)數(shù)。此時(shí),p指向開(kāi)始的“猴子”。因?yàn)椴捎昧随湵矸椒ǎ@個(gè)過(guò)程只需要關(guān)注p指針的next指向即可。

a、 保存初始的“猴子”圓圈參數(shù)。

/* 保存節(jié)點(diǎn)總數(shù) */
total = n;printf("
the out num:");q = head;

為什么要保留這個(gè)呢?首先要控制猴子數(shù)目,所以保留了全部的數(shù)目。其次用q(qurry)來(lái)保留剔除猴子前面的鏈表,并連接剔除猴子后的鏈表。這樣,完成了循環(huán)鏈表的元素刪除。

b、 猴子查數(shù)。

猴子查數(shù)是整個(gè)程序的關(guān)鍵,需要完成以下任務(wù):a、找到開(kāi)始的“猴子”數(shù);b、刪除該“猴子”;c、將刪除掉的循環(huán)鏈表首尾連接起來(lái)。

/* 只剩一個(gè)節(jié)點(diǎn)時(shí)停止循環(huán) */while (total != 1){/* 報(bào)數(shù)過(guò)程,p指向要?jiǎng)h除的節(jié)點(diǎn) */for (i = 1; i < m; i++){p = p->next;}/* 打印要?jiǎng)h除的節(jié)點(diǎn)序號(hào) */printf("[%d] ", p->data);/* q 指向 p 節(jié)點(diǎn)的前驅(qū) */while (q->next != p){q = q->next;}/* 刪除 p 節(jié)點(diǎn) */q->next = p->next;/* 保存被刪除節(jié)點(diǎn)指針 */s = p;/* p 指向被刪除節(jié)點(diǎn)的后繼 */p = p->next;/* 釋放被刪除的節(jié)點(diǎn) */free(s);/* 節(jié)點(diǎn)個(gè)數(shù)減一 */total--;}/* 打印最后剩下的節(jié)點(diǎn)序號(hào) */printf("

the last num:[%d] 

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

通過(guò)以上數(shù)據(jù)運(yùn)算,可以完成相應(yīng)鏈表元素的刪除,這或許就是C語(yǔ)言程序的魅力所在。

使用C語(yǔ)言的指針

比如本程序的鏈表指針的定義,p,s,q。

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

我們知道,指針操作不但可以減少數(shù)據(jù)操作需要的內(nèi)存,還可以提高程序的運(yùn)行速度。

指針的優(yōu)勢(shì),或許在本程序中表現(xiàn)的不明顯,在大量數(shù)據(jù)和對(duì)操作速度要求比較敏感的情況下會(huì)很明顯,比如Linux內(nèi)核中,就會(huì)有很好的體現(xiàn)。

總之,對(duì)于嵌入式工程師,不但能設(shè)計(jì)出好的硬件電路,如果也能寫(xiě)出好的軟件程序就會(huì)讓我們的生活更加美好。

原文標(biāo)題:嵌入式工程師,用好C語(yǔ)言這一利器的三要素

文章出處:【微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7134

    瀏覽量

    89451
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137499
  • 硬件電路
    +關(guān)注

    關(guān)注

    39

    文章

    244

    瀏覽量

    29292

原文標(biāo)題:嵌入式工程師,用好C語(yǔ)言這一利器的三要素

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言程序設(shè)計(jì)教程第4版第8講:指針

    C語(yǔ)言指針講解
    發(fā)表于 11-20 14:10 ?0次下載

    C語(yǔ)言指針學(xué)習(xí)筆記

    本文從底層內(nèi)存分析,徹底讓讀者明白C語(yǔ)言指針的本質(zhì)。
    的頭像 發(fā)表于 11-05 17:40 ?289次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>指針</b>學(xué)習(xí)筆記

    C語(yǔ)言指針運(yùn)算符詳解

    C語(yǔ)言中,當(dāng)你有一個(gè)指向數(shù)組中某個(gè)元素的指針時(shí),你可以對(duì)該指針執(zhí)行某些算術(shù)運(yùn)算,例如加法或減法。這些運(yùn)算可以用來(lái)遍歷數(shù)組中的元素,如ptr[i]等價(jià)于*(ptr + i)。然而,如果
    的頭像 發(fā)表于 10-30 11:16 ?298次閱讀

    如何在Excel中靈活運(yùn)用SUMIF函數(shù)

    。 criteria :定義哪些單元格將被加總的條件。 sum_range :(可選)實(shí)際要加總的單元格區(qū)域。如果省略, range 將被用作 sum_range 。 示例: 假設(shè)你有一個(gè)銷售數(shù)據(jù)表,A列是日期,B列是產(chǎn)品名稱,C列是銷售額。你想
    的頭像 發(fā)表于 10-30 09:53 ?429次閱讀

    C語(yǔ)言與其他編程語(yǔ)言的比較

    C語(yǔ)言作為一種歷史悠久的編程語(yǔ)言,自其誕生以來(lái),一直在軟件開(kāi)發(fā)領(lǐng)域扮演著重要角色。它以其高效、靈活和可移植性強(qiáng)的特點(diǎn),成為了系統(tǒng)級(jí)編程的首選語(yǔ)言
    的頭像 發(fā)表于 10-29 17:30 ?352次閱讀

    C語(yǔ)言指針詳細(xì)解析

    可以對(duì)數(shù)據(jù)本身,也可以對(duì)存儲(chǔ)數(shù)據(jù)的變量地址進(jìn)行操作。 指針是一個(gè)占據(jù)存儲(chǔ)空間的實(shí)體在這一段空間起始位置的相對(duì)距離值。在C/C++語(yǔ)言中,
    發(fā)表于 09-14 10:03

    面試中的高頻問(wèn)題:指針函數(shù)與函數(shù)指針,你能完美應(yīng)對(duì)嗎?

    一直覺(jué)得C語(yǔ)言較其他語(yǔ)言最偉大的地方就是C語(yǔ)言中的指針,有些人認(rèn)為
    的頭像 發(fā)表于 06-22 08:11 ?1828次閱讀
    面試中的高頻問(wèn)題:<b class='flag-5'>指針</b>函數(shù)與函數(shù)<b class='flag-5'>指針</b>,你能完美應(yīng)對(duì)嗎?

    Keil+C51中對(duì)雙數(shù)據(jù)指針的直接利用

    Keil+C51中對(duì)雙數(shù)據(jù)指針的直接利用
    發(fā)表于 06-18 10:15 ?0次下載

    提高C代碼可讀性的編寫(xiě)技巧與策略

    指針C 語(yǔ)言的靈魂,是 C 比其他語(yǔ)言靈活,更強(qiáng)大的地方。所以學(xué)習(xí)
    發(fā)表于 04-23 18:25 ?561次閱讀

    C語(yǔ)言函數(shù)指針六大應(yīng)用場(chǎng)景詳解

    函數(shù)指針是一種非常強(qiáng)大的編程工具,它可以讓我們以更加靈活的方式編寫(xiě)程序。在本文中,我們將介紹 6 個(gè)函數(shù)指針的高級(jí)應(yīng)用場(chǎng)景,并貼出相應(yīng)的代碼案例和解釋。
    的頭像 發(fā)表于 04-23 18:19 ?951次閱讀

    CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)在制袋機(jī)生產(chǎn)中的靈活運(yùn)用

    在制袋機(jī)生產(chǎn)中,為了實(shí)現(xiàn)高效、精準(zhǔn)的控制,許多廠家開(kāi)始采用工業(yè)互聯(lián)網(wǎng)技術(shù)。其中,開(kāi)疆CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)成為了實(shí)現(xiàn)這一目標(biāo)的關(guān)鍵設(shè)備。本文將詳細(xì)介紹CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)在制袋機(jī)生產(chǎn)中的靈活運(yùn)用。
    的頭像 發(fā)表于 03-26 17:30 ?604次閱讀
    CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)在制袋機(jī)生產(chǎn)中的<b class='flag-5'>靈活運(yùn)用</b>

    CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)在制袋機(jī)生產(chǎn)中的靈活運(yùn)用

    在制袋機(jī)生產(chǎn)中,為了實(shí)現(xiàn)高效、精準(zhǔn)的控制,許多廠家開(kāi)始采用工業(yè)互聯(lián)網(wǎng)技術(shù)。其中,開(kāi)疆CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)成為了實(shí)現(xiàn)這一目標(biāo)的關(guān)鍵設(shè)備。本文將詳細(xì)介紹CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)在制袋機(jī)生產(chǎn)中的靈活運(yùn)用
    的頭像 發(fā)表于 03-26 17:29 ?502次閱讀
    CCLink轉(zhuǎn)EtherCAT網(wǎng)關(guān)在制袋機(jī)生產(chǎn)中的<b class='flag-5'>靈活運(yùn)用</b>

    C語(yǔ)言基礎(chǔ)-為什么要使用C?

    當(dāng)今最流行的 Linux 操作系統(tǒng)和 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) MySQL 都是使用 C 語(yǔ)言編寫(xiě)的。
    發(fā)表于 03-25 11:20 ?481次閱讀

    C語(yǔ)言指針用法

    C語(yǔ)言編程中善用指針可以簡(jiǎn)化一些任務(wù)的處理,而對(duì)于一些任務(wù)(比如動(dòng)態(tài)內(nèi)存分配),必須要有指針才行的。也就是說(shuō)精通C
    發(fā)表于 03-05 14:22 ?385次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的<b class='flag-5'>指針</b>用法

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言
    的頭像 發(fā)表于 02-05 14:11 ?2563次閱讀