99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

單片機入門:C語言講解(二)

   《 單片機入門:C語言講解(一)》一文,我花了一個月左右的時間把C語言預編譯相關的知識點梳理了一遍,可能還有疏漏的知識點,后面有需要再補充吧。

    接下來這一帖,系統(tǒng)地講講編譯階段的C語法,這是大頭部分,知識點比較多,也比較龐雜,再接再厲,慢慢梳理,如果有講的不到位或者錯誤的地方,希望大家及時斧正,謝謝。

   我的目標是盡量采用通俗易懂的語言講解C語法以及單片機相關的故事,少出現(xiàn)大段的代碼(看別人的代碼本身就是一種折磨),將單片機涉及到的功能函數(shù)模塊化,像使用元器件一樣調(diào)用各功能函數(shù)。

   這是我寫帖子的態(tài)度,此段寫在開頭,實時提醒自己。

全部回復(24)
正序查看
倒序查看
2021-06-11 13:01

開始講解C語法之前,我想問大家兩個問題:

第一:C語言的核心是什么?

第二:C語言如何控制單片機實現(xiàn)各種各樣的復雜功能?

學會提問,帶著問題學習,目的性更強,且效率更高。梳理知識點時,我喜歡先找到該知識點對應的脈絡,然后從上往下依次理順。這樣的方式便于記憶以及后期的查漏補缺。

回到開始的第一個問題,C語言的核心是什么,很多人都會說是指針。市面上很多的教材及博客文章都提到了這一點,那為什么有此一說呢?

0
回復
2021-06-11 13:01

  指針的含義是什么,作用又為哪般?為什么開篇講解C語法,我不從變量(標識符)的定義,命名規(guī)則,常用的運算等講起,而偏偏先將很多人都頭疼的指針拎出來呢?

  因為指針是C語言的脈絡,所有語法實質(zhì)上都是圍繞著指針展開的。兵法有云,擒賊先擒王,只要抓住了C語言的主線,就能一步步地將所有知識點串聯(lián)起來。

  什么是指針呢,答案是地址(不太嚴謹,便于大家理解,后面會補充解釋)。單片機中的地址又是什么呢,有什么作用呢?是不是有點像俄羅斯套娃,要解釋一個問題,卻發(fā)現(xiàn)需要用更多的問題來解釋。

  單片機中的地址是什么,有什么作用?這就回到文章開始處提到的第二個問題,C語言如何控制單片機實現(xiàn)各種各樣的復雜功能?答案是寄存器。

0
回復
2021-06-20 11:39

    寄存器是什么,它是單片機內(nèi)部用來存放數(shù)據(jù)的一些小型存儲區(qū)域,主要作用是暫存參與運算的數(shù)據(jù)和運算結(jié)果,即過程數(shù)據(jù)。寄存器屬于單片機內(nèi)部存儲功能模塊中的RAM模塊,包括通用寄存器、專用寄存器和控制寄存器。寄存器擁有非常高的讀寫速度,所以在寄存器之間的數(shù)據(jù)傳送非常快。

    單片機內(nèi)部的存儲功能模塊分為兩大塊,分別為ROM區(qū)和RAM區(qū)。RAM為隨機存儲器件,掉電不會保存數(shù)據(jù),而ROM可以在掉電的情況下,依然保存原有的數(shù)據(jù)。ROM是Read Only Memory的意思,也就是說該類存儲器只能讀,不能寫。而RAM是Random Access Memory的縮寫,此類存儲器可以隨機讀寫。

0
回復
2021-06-20 11:39

    根據(jù)二者的不同特性,ROM一般用于存儲固定的系統(tǒng)程序和字庫等,51單片機ROM對應的C語言關鍵字為code。這類存儲數(shù)據(jù)只用于讀取操作,不涉及數(shù)據(jù)的修改,即寫操作。

    RAM代表的是讀寫存儲器,可在其中的任意存儲單元進行讀或?qū)懖僮鳎瑔纹瑱C斷電后其內(nèi)的中間過程數(shù)據(jù)將不再保存,重新上電后則從ROM中調(diào)取相關的數(shù)據(jù)配置重新裝入,通常用來存放輸入輸出數(shù)據(jù)、中間結(jié)果等。

    通俗的說,單片機內(nèi)部的ROM和RAM分別對應著電腦的硬盤和內(nèi)存。前文反復提到的寄存器其實就相當于是計算機內(nèi)存中的一小部分。

0
回復
2021-06-20 11:40

    花了這么多口水作為鋪墊,我的目的就是想告訴諸位看官“指針的概念”并不高深。指針這一工具的用途只不過是為了更簡單明了地標注內(nèi)存中的某一區(qū)域而已。下圖為指針與內(nèi)存單元的關系:

    隨著對單片機硬件原理的認識不斷加深,慢慢大家會發(fā)現(xiàn)計算機底層語言(匯編語言,C語言)的語法規(guī)則基本都是圍繞著RAM內(nèi)存展開的,大抵不過是為了更合理便捷地規(guī)劃使用內(nèi)存罷了。后續(xù)C語言中的諸多語法概念的引出都將圍繞著指針及內(nèi)存來闡述。

0
回復
2021-06-20 11:40

    C語言書籍開篇幾乎都是從“hello world!”講起,然后由變量的定義來進入C語法正題。我們就直接從“定義變量”這個話題入手吧,依舊采用我擅長的咬文嚼字的設問方式推導講解。

“定義變量”四個字引出兩個關鍵字“定義”和“變量”。什么是“定義”,它的作用為哪般,與“定義”有區(qū)別的概念是什么?什么是“變量”,它的作用是什么,有哪些類型,與之相關聯(lián)的語法有哪些。上述幾個問題我依次解答,當然都圍繞著“指針”或“內(nèi)存”的概念闡述。

0
回復
2021-06-21 20:53

    什么是“定義”,它的作用是什么。歸納總結(jié)后,我個人對C語法中“定義”的概念及作用解釋如下:

    1. 在內(nèi)存中開辟一個區(qū)域(區(qū)域的大小由數(shù)據(jù)變量的類型決定)用于存儲合適的數(shù)據(jù)。

    2. 給開辟的內(nèi)存空間賦予名稱,專業(yè)術語稱作“標識符”。對于變量而言,此標識符即為變量名。變量名與開辟的內(nèi)存空間一一對應,此變量名代表關聯(lián)內(nèi)存空間的地址,而內(nèi)存空間則用于存儲對應類型及大小的數(shù)據(jù)。

    需要注意的是,“定義”完成即標志著變量名與對應內(nèi)存空間的匹配,不可再重復定義,否則編譯器會報錯。對于全局變量而言,整個.c文件中只能被定義一次,對于局部變量而言,在函數(shù)體內(nèi)部只能被定義一次。

    如何避免頭文件中全局變量及函數(shù)的重復定義包含問題,就涉及到前文講解的預編譯中的”#ifndef”相關知識點,如若不了解,請回顧前文對應的知識點。

0
回復
2021-06-21 21:09

    給開辟的內(nèi)存空間賦予名稱是“定義”的第二個作用,通俗的講就是命名。既然是命名,就牽扯出命名規(guī)則。命名的對象包括宏名,變量名,函數(shù)名,數(shù)組名,結(jié)構(gòu)體名等等,C語言將此類命名的對象統(tǒng)稱為“標識符”。

“標識符”的命名有一套規(guī)則,不可隨便命名,否則編譯器會報錯。

0
回復
2021-06-21 21:09

1.C語言規(guī)定,標識符只能由字母(A~Z, a~z)、數(shù)字(0~9)和下劃線(_)組成,并且第一個字符必須是字母或下劃線,不能是數(shù)字,上述字符之外的其他字符不允許出現(xiàn)在標識符中。

2. 標識符長度受到不同編譯器的限制,同時也受到操作系統(tǒng)的限制。c89規(guī)定標識符長度為31個字符以內(nèi),c99規(guī)定為63個字符以內(nèi)。為方便記憶,個人建議標識符的長度不超過31個字符。例如某編譯器中規(guī)定標識符前31位有效,當兩個標識符前31位均相同時,則被認為是同一標識符。

3. 標識符區(qū)分大小寫字母,HELLO與hello是兩個不同的變量。

4.C語言中的關鍵字,有特殊意義,不能作為標識符。

5.自定義標識符最好取具有一定意義的字符串,便于記憶理解和后期的代碼維護。

0
回復
2021-06-21 21:09

    在編程初期,大家就應該養(yǎng)成規(guī)范的編程習慣(包括命名規(guī)范,代碼書寫規(guī)范等)。良好的編程習慣有助于我們編寫出更具可讀性,可維護性,高效性,健壯性的代碼。

    解釋了“定義”的含義,接著我們再聊聊與“變量”相關的知識點。什么是“變量”, 有哪些類型的變量,變量的類型與內(nèi)存的關系是什么,變量的強制類型轉(zhuǎn)換有何意義,什么是變量的作用域及生存周期,與變量相關的語法點還有哪些?

    針對上述“變量”相關的問題,我們圍繞指針與內(nèi)存的原則依次展開。“定義”是劃分內(nèi)存,但是劃分多大的內(nèi)存,這就需要由變量的數(shù)據(jù)類型決定。劃分的內(nèi)存區(qū)域何時釋放則取決于變量的生存周期。劃分的內(nèi)存區(qū)域中存儲的數(shù)據(jù)能被哪些變量及函數(shù)調(diào)用呢?這得看變量的作用域。關于變量的數(shù)據(jù)類型,生存周期及作用域,后面我會詳細講解。

0
回復
2021-06-21 21:09

    在定義變量的同時,通常會對應著變量賦值,該賦值動作一般是取我們需要的常量將其填充至劃分的內(nèi)存單元中。如若僅僅定義了變量,卻沒有賦值呢?這就牽出變量的初始化問題。不管是全局變量還是局部變量,編譯器默認都會對其初始化。只不過全局變量的初始化默認為0,而局部變量的初始化則為隨機數(shù)。

0
回復
2021-06-22 21:43

    因為全局變量的初始值默認為零,所以該類變量不需要賦初值。不過為了培養(yǎng)良好的代碼習慣,個人建議大家最好還是賦初值。另外,定義的全局變量在代碼中未被使用,編譯器也不會報錯。

    局部變量的初始值,編譯器默認賦值為隨機數(shù),因此不能在其他地方作為右值使用。如若被當作右值使用,編譯器會提示錯誤:“使用了未初始化的局部變量”。局部變量定義后沒有賦初值,系統(tǒng)會拋出警告:“xxx為未使用的局部變量”。因此,局部變量定義后就必須要賦初值。補充說明:還得看編譯器的環(huán)境,在gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)中編譯并沒有報錯。其他編譯器環(huán)境,大家可以測試看看。

0
回復
2021-06-23 11:43

    什么是全局變量,什么是局部變量。他們有什么區(qū)別。使用問答方式解釋相關概念,個人覺得效果很好,這樣可以幫助大家養(yǎng)成主動思考的習慣,同時也加深了對知識點的印象。電子行業(yè)涉及的瑣碎知識點太多,某個知識點在腦海中有了印象,再次遇到此類問題時可以借助電腦,書籍等工具把它搞明白。

    全局變量和局部變量由其定義的位置決定。全局變量定義在所有函數(shù)外部,局部變量則定義在函數(shù)內(nèi)部。二者定義的位置不同就引出變量的作用域及生存周期的概念問題。

0
回復
2021-06-23 11:43

    “作用域”作何解釋呢,從其字面意思入手吧。“作用”二字包含“有效的,能用的”含義,“域”字則有“范圍,邊界”的含義。三個字連起來解釋為“有效的范圍”,再加上“變量”二字,則解釋為“變量有效的范圍”。再進一步將變量與內(nèi)存空間掛鉤,“變量有效的范圍”可以理解為“內(nèi)存空間中的存儲數(shù)據(jù)的有效范圍”。至此我們推導出“變量的作用域”等價于“內(nèi)存空間中的存儲數(shù)據(jù)的有效范圍”。

    “生存周期”又作何解釋呢?“生存”有“活著,存在”的含義,“周期”則表示“時長,時段”。“生存周期”可理解為“存在的時長,存在的時間”,再加上“變量”二字,則解釋為“變量存在的時間”。進一步聯(lián)想變量與內(nèi)存空間的概念,上述概念可解釋為“內(nèi)存空間中存儲數(shù)據(jù)的存在時間”。

0
回復
2021-06-23 11:43

    能不能將“內(nèi)存空間中存儲數(shù)據(jù)的存在時間”這段文字背后的隱藏含義揭開呢?諸位看官,別急。如果你能堅持看到這里,小可想對您說聲“謝謝”。您的求知欲很旺,正是您的激情讓我能夠堅持將文章寫下去。

    談到內(nèi)存空間,我們自然而然地想到數(shù)據(jù)的存儲,但大家有沒有想過計算機的內(nèi)存是有限的。如果只是一味地存儲數(shù)據(jù),內(nèi)存空間早晚要爆倉(引入快遞倉庫爆倉的概念,便于大家更形象的理解。快遞倉庫用于存放物品,內(nèi)存空間其實也是個倉庫,只不過它用于存放數(shù)據(jù)罷了)。

    為防止內(nèi)存空間爆倉,編譯器建立了一套規(guī)則,用于配套存儲數(shù)據(jù)的動作使用,也就是釋放數(shù)據(jù),專業(yè)術語稱作“內(nèi)存回收”。變量占用的內(nèi)存回收方式取決于變量的存儲類型,這一話題后面會詳細講解。

0
回復
2021-06-23 11:43

    腦海中有了內(nèi)存數(shù)據(jù)存儲與釋放的概念,再次回到“內(nèi)存空間中存儲數(shù)據(jù)的存在時間”這個話題。這段文字背后隱藏的含義已經(jīng)躍然紙上。它其實想表達的含義是內(nèi)存中存儲的數(shù)據(jù)何時釋放。換句話說“生存周期”的概念表明了內(nèi)存中的存儲數(shù)據(jù)何時釋放。

    至此,廢了如此多的筆墨終于將“作用域”及“生存周期”的概念闡述完成。接下來我們可以說說全局變量及局部變量的作用域及生存周期的差別。

0
回復
2021-06-23 11:43

    計算機語言有很多種,在寫這篇有關C語法的文章時,我總想著將C語法的知識點講解的越細越好,但寫著寫著我突然發(fā)現(xiàn)語法固然重要,但隱藏在語法背后的計算機語言的思想更重要。我會嘗試著將自己對計算機語法思想的一些感悟心得寫進去。

    畢竟計算機的語言太多了,而且有些已經(jīng)被淘汰或即將被淘汰,還有更多的語言正在孕育誕生中。僅僅局限于單一語法的講解并不能滿足個人對知識背后思想的占有欲,我總在試圖抓住一些精髓的東西。

0
回復
2021-06-25 09:30

    回到“作用域及生存周期”的話題。我們知道全局變量定義在所有函數(shù)外部,局部變量定義在功能函數(shù)內(nèi)部。二者位置的不同決定著其作用域及生存周期不同。前者位置在所有函數(shù)外部,所以它的作用域默認為是整個程序,包括所有的.c和.h文件,換句話說它可以被任意函數(shù)調(diào)用。而局部變量僅在某功能函數(shù)內(nèi)部定義,這意味著它的作用域僅局限在某單一函數(shù)內(nèi)部。

    至于二者的生存周期,則是永恒與霎那的區(qū)別。全局變量伴隨著運行的程序同生共滅,只要程序在不間斷的運行,那全局變量就會一直存在,永不釋放,此即為永恒。局部變量僅在其定義的功能函數(shù)被調(diào)用時才會存在。一旦功能函數(shù)結(jié)束調(diào)用,局部變量就會消亡,其占有的內(nèi)存即被釋放,這代表著霎那。

0
回復
2021-06-25 09:31

    永恒與霎那本是佛家用語,小子不才,用其論述全局變量與局部變量的區(qū)別,望諸位看官海涵。全局永恒,局部霎那,它們各自的意義為哪般,或者說各有哪些優(yōu)劣呢。常人都向往永生,內(nèi)心深處對死亡都有著本能的恐懼。

    但人生實苦,肉身永恒背后需承受的諸般痛苦與磨難卻非常人所愿。霎那雖短,但也正因其短暫,痛苦與磨難便也不顯得那么難以忍受。

    對于時間而言,永恒是其上限,霎那為其下限,能夠在時間長河的區(qū)域中找到對自己有意義的時段不失為智者的選擇,我想這就是生命的意義吧。

0
回復
iszjt
LV.5
21
2021-08-05 11:27

C語言作為一門非常適合編程入門的語言也是嵌入式單片機行業(yè)必備的開發(fā)語言,打好基礎的重要性不言而喻。

0
回復
2021-08-05 12:02

變量的大小,類型:

    定義變量的實質(zhì)是在內(nèi)存中開辟一段空間用于存儲數(shù)據(jù)。那問題來了,需要在內(nèi)存中開辟多大的空間呢,正整數(shù)、小數(shù),負數(shù),字符如何表示呢?這就引出了C語言關于數(shù)據(jù)類型的話題。

    C的數(shù)據(jù)類型大致可以分為四類,分別是基本類型,構(gòu)造類型,指針類型及空類型。本著循序漸進的原則,我們就先從基本類型入手。如果各位看官充分理解了數(shù)據(jù)的基本類型,那后續(xù)三種數(shù)據(jù)類型也是手到擒來。

0
回復
2021-08-05 12:02

    C的基本類型用六個關鍵字表示,分別為char、short、int、long、float、double,依次代表的含義為字符型,短整型,整型,長整型,單精度浮點型,雙精度浮點型。其中前四種類型用于表示各類整型數(shù)據(jù),既然是整型數(shù)據(jù),必然涉及到符號問題。

    整型數(shù)據(jù)有無符號使用關鍵字signed(有符號)和unsigned(無符號)表示。默認情況下,整型變量均帶有符號,即隱式定義為signed 型。如此規(guī)定整型數(shù)據(jù)的符號規(guī)則優(yōu)點是便于用戶進行數(shù)值運算,但缺點也很明顯,那就是整型數(shù)據(jù)表示的范圍減少了一半。

0
回復
2021-08-05 12:03

    計算機大部分時間主要是處理各種數(shù)據(jù)信息,而數(shù)據(jù)信息通常是無符號整型。如果程序員未注意此類細節(jié)問題,有可能因為數(shù)據(jù)溢出導致程序宕機。

    前文講過定義變量其實就是在內(nèi)存中畫一塊連續(xù)的空間而已。而內(nèi)存不可分割的最小單元為一個字節(jié),那問題就簡單了。在32位系統(tǒng)中,C語法規(guī)定char型變量占用一個字節(jié),short型變量占用兩個字節(jié),int型變量占用四個字節(jié),long型變量占用四個字節(jié),long long型變量占用八個字節(jié)。

    后續(xù)會列出不同類型數(shù)據(jù)的表示范圍

0
回復
aisi999
LV.1
25
2021-12-01 13:05

寫得太好了!真正的智者。意猶未盡,后文呢......

0
回復
發(fā)
主站蜘蛛池模板: 久综合在线 | 免费av毛片不卡无码 | 国精品无码一区二区三区在线 | 亚洲第一页在线视频 | 国产免费自拍视频 | 亚洲一二三四2021不卡 | 中国美女a级毛片 | xxxxx亚洲| 国产乱子伦视频大全 | 恋爱的味道1在线 | 国产高清福利无码视频 | 人妻熟妇乱又伦精品视频 | 懂色av影视一区二区三区 | 久久不卡视频 | 国产蜜月AⅤ网站 | 精品国产综合乱码久久久久久 | 国产一区二区久久久久 | 欧美三日本三级少妇三级99观看视频 | 久久免费的精品国产v∧ | 99精品一级欧美片免费播放资讯 | 成人午夜爽爽爽免费视频 | 麻豆嫩芽忘忧草一区二区三区 | 无码高潮又爽又黄A片软件 18禁无遮挡免费视频网站 | 国产不卡一区二区视频 | 三年片在线观看免费大全 | 国产精品乱子 | 91视频www. | 99在线观看精品 | 久久久乱码精品亚洲日韩 | 亚洲国产日韩在线人成蜜芽 | 不戴奶罩的教师水卜樱在线观看 | 成人黄网在线观看 | 欧美群交射精内射颜射潮喷 | 国产香蕉一区二区在线网站 | 日韩精品天堂 | 欧美精欧美乱码一二三四区 | 性一交一乱一伦一色一情孩交 | 特黄aaaaaaaaa毛片免 | 精品麻豆一卡2卡三卡4卡乱码 | 欧美黑人又粗又大久久久 | 亚州成人在线观看 |