




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式單片機(jī)原理及應(yīng)用 燕山大學(xué)電氣工程學(xué)院自動(dòng)化系燕山大學(xué)電氣工程學(xué)院自動(dòng)化系 1 ARM嵌入式系統(tǒng)概述 2 STM32單片機(jī)結(jié)構(gòu)和最小系統(tǒng) 3 基于標(biāo)準(zhǔn)外設(shè)庫(kù)的C語(yǔ)言程序設(shè)計(jì)基礎(chǔ) 4 STM32通用輸入輸出GPIO 5 STM32外部中斷 6 STM32通用定時(shí)器 7 STM32通用同步/異步收發(fā)器USART 8 直接存儲(chǔ)器存取DMA 9 STM32的模數(shù)轉(zhuǎn)換器ADC 10 STM32的集成電路總線I2C 11 STM32的串行外設(shè)接口SPI 第第3章章 基于標(biāo)準(zhǔn)外設(shè)庫(kù)的基于標(biāo)準(zhǔn)外設(shè)庫(kù)的C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)語(yǔ)言程序設(shè)計(jì)基礎(chǔ) C語(yǔ)言的特點(diǎn)語(yǔ)言的特點(diǎn) 1、語(yǔ)言簡(jiǎn)單、緊湊、靈活。(32個(gè)關(guān)鍵字,9
2、種控 制語(yǔ)句) 2、運(yùn)算符豐富(34種表達(dá)式) 3、數(shù)據(jù)結(jié)構(gòu)豐富 4、具有結(jié)構(gòu)化的控制語(yǔ)句 5、目標(biāo)代碼質(zhì)量高,程序執(zhí)行效率高。 6、可移值性好 7、兼有低級(jí)語(yǔ)言和高級(jí)語(yǔ)言的特點(diǎn) 3.1 嵌入式嵌入式C語(yǔ)言基礎(chǔ)語(yǔ)言基礎(chǔ) 3.1 嵌入式嵌入式C語(yǔ)言基礎(chǔ)語(yǔ)言基礎(chǔ) 每個(gè)C程序通常分為兩個(gè)文件,一個(gè)文件 用于保存程序的聲明,稱(chēng)為頭文件,以“.h”為 后綴。另一個(gè)文件用于保存程序的實(shí)現(xiàn),稱(chēng)為 源文件,以“.c”為后綴。如果一個(gè)工程中頭文 件數(shù)目較多,通常將頭文件和源文件分別保存 在不同的目錄以便于維護(hù)。例如可以將頭文件 保存于inc目錄,源文件保存于src目錄。 版權(quán)和版本版權(quán)和版本聲聲明明 /* *
3、Copyright (c) 2014,燕山大學(xué)電氣工程學(xué)院 * All rights reserved. * 文件名稱(chēng):filename.h * 摘 要:簡(jiǎn)要描述本文件的內(nèi)容 * 當(dāng)前版本:1.1 * 作 者:輸入作者(或修改者)名字 * 完成日期:2014年7月20日 * 取代版本:1.0 * 原作者 :輸入原作者(或修改者)名字 * 完成日期:2014年1月10日 */ 頭文件結(jié)構(gòu)頭文件結(jié)構(gòu) 頭文件版權(quán)和版本聲明、預(yù)處理塊和函數(shù)聲明頭文件版權(quán)和版本聲明、預(yù)處理塊和函數(shù)聲明 源文件結(jié)構(gòu)源文件結(jié)構(gòu) 源文件版權(quán)和版本聲明、頭文件的引用和程序的實(shí)現(xiàn)體源文件版權(quán)和版本聲明、頭文件的引用和程序的實(shí)現(xiàn)體
4、 簡(jiǎn)單的簡(jiǎn)單的C程序介紹程序介紹 例1:最簡(jiǎn)單的程序 #include /包含頭文件 int main(void)/*主函數(shù)*/ printf(“this is a c program!n”); /*輸出了一句話*/ 例例2 求兩個(gè)數(shù)之和求兩個(gè)數(shù)之和 #include /包含頭文件 int main(void)/*主函數(shù)*/ int a,b,sum;/*定義變量*/ a=100;b=200; /*給變量賦值*/ sum=a+b/*求a與b的和*/ printf(“sum=%dn”,sum);/*輸出結(jié)果*/ scanf(“%d%d”, 例例3 求兩個(gè)數(shù)中的最大數(shù)求兩個(gè)數(shù)中的最大數(shù) #inclu
5、de /包含頭文件 int max(int x,int y); /*定義max函數(shù),函數(shù)值為整型,x,y為型參,整型*/ int z; /*函數(shù)內(nèi)用到內(nèi)部變量z,也要加以定義*/ if(xy) z=x; /*比較x,y的大小,如果x大于y,則執(zhí)行z=x*/ else z=y; /*否則執(zhí)行z=y*/ return(z); /*將z的值返回,通過(guò)max帶回調(diào)用處*/ int main(void)/*主函數(shù)*/ int a,b,c; /*定義變量*/ scanf(“%d%d”, /*輸入變量a,b的值*/ c=max(a,b); /*調(diào)用函數(shù),將得到的值賦給c*/ printf(“max=%dn”
6、,c); /*輸出c的值*/ C程序的結(jié)構(gòu)特點(diǎn)和書(shū)寫(xiě)格式程序的結(jié)構(gòu)特點(diǎn)和書(shū)寫(xiě)格式 1、函數(shù)是組成C程序的基本結(jié)構(gòu) 2、一個(gè)函數(shù)由兩部分組成: 函數(shù)說(shuō)明部分函數(shù)體 函數(shù)體:說(shuō)明部分 執(zhí)行部分 3、一個(gè)程序總是從main函數(shù)開(kāi)始執(zhí)行 4、語(yǔ)句以分號(hào);結(jié)束 5、書(shū)寫(xiě)格式自由 6、用/*/做注釋 字符集字符集 什么是字符集 在C語(yǔ)言程序中允許出現(xiàn)的所有基本字符的組合稱(chēng)為C語(yǔ)言的字符 集。 字符集分類(lèi) (1) 大小寫(xiě)英文字母(52個(gè)) (2) 數(shù)字符號(hào)(10個(gè)) (3) 鍵盤(pán)符號(hào)(33個(gè)) (4) 轉(zhuǎn)義字符 C語(yǔ)言的基本元素語(yǔ)言的基本元素 1、符號(hào)集(字符集) C語(yǔ)言使用的基本符號(hào)共有如下5種: (1)
7、大寫(xiě)字母:A-Z (2)小寫(xiě)字母:a-z (3)阿拉伯?dāng)?shù)字:0-9 (4)下劃線:_ (5)標(biāo)點(diǎn)符號(hào)和運(yùn)算符 標(biāo)識(shí)符標(biāo)識(shí)符 什么是標(biāo)識(shí)符什么是標(biāo)識(shí)符 標(biāo)識(shí)符是用戶(hù)自定義的一種字符序列,通常用來(lái)表示程序中需要 辨認(rèn)的對(duì)象名稱(chēng)。 標(biāo)識(shí)符的命名規(guī)則標(biāo)識(shí)符的命名規(guī)則 標(biāo)識(shí)符是由字符或下劃線開(kāi)頭的字母、數(shù)字、下劃線組成的一串 符號(hào); 保留字不能作為標(biāo)識(shí)符。 “_”可以作為標(biāo)識(shí)符的第一個(gè)字母,但是往往用于庫(kù)代碼 正確標(biāo)識(shí)符正確標(biāo)識(shí)符:sum i a2 a_2 _a2 _a_2 錯(cuò)誤的標(biāo)識(shí)符錯(cuò)誤的標(biāo)識(shí)符:2a a? c.g a-2 if while C語(yǔ)言的數(shù)據(jù)類(lèi)型語(yǔ)言的數(shù)據(jù)類(lèi)型 數(shù)據(jù)是操作的對(duì)象,數(shù)據(jù)類(lèi)型
8、是指數(shù)據(jù)的內(nèi)在表現(xiàn)形式(代碼、存 儲(chǔ)、運(yùn)算) C語(yǔ)言程序的數(shù)據(jù)類(lèi)型如下: 空類(lèi)型 數(shù)據(jù)類(lèi)型 基本類(lèi)型 數(shù)據(jù)類(lèi)型 指針類(lèi)型 整型int 實(shí)型(浮點(diǎn)型) 字符型char 單精度f(wàn)laot 雙精度double 數(shù)組 結(jié)構(gòu)體 共用體 枚舉型 派生類(lèi)型 C語(yǔ)言的數(shù)據(jù)類(lèi)型語(yǔ)言的數(shù)據(jù)類(lèi)型 常量常量 什么是常量 又稱(chēng)為字面量,表述常數(shù) 常量類(lèi)型 整型常量 實(shí)型常量 字符常量 字符串常量 常量和變量常量和變量 一、常量和符號(hào)常量 1、常量:在程序運(yùn)行過(guò)程中, 其值不能被改變的量 常量區(qū)分為不同類(lèi)型(表現(xiàn)形式) 如:12、3.2、a 二、變量 1、變量:其值是可以改變的量, 它用標(biāo)識(shí)符(變量名)來(lái)表示, 在內(nèi)存中
9、占據(jù)一定的存儲(chǔ)單元。 2、變量的定義方法 類(lèi)型符標(biāo)識(shí)符 3、注意: 1.見(jiàn)字知意 2.先定義后使用 3.習(xí)慣:符號(hào)常量大寫(xiě),變量名小寫(xiě) 如:int a,b,max; char c1,c2,s; float x,y,z; double i,j; 變量變量 變量數(shù)據(jù)類(lèi)型 變量存儲(chǔ)類(lèi)型變量存儲(chǔ)類(lèi)型 變量的定義和初始化變量的定義和初始化 變量的初始化 變量在定義時(shí)就要初始化 變量賦初值的語(yǔ)句格式 存儲(chǔ)類(lèi)型符 數(shù)據(jù)類(lèi)型符 變量名=初值; 結(jié)構(gòu)型的定義結(jié)構(gòu)型的定義 定義語(yǔ)句 struct 結(jié)構(gòu)名稱(chēng) 數(shù)據(jù)類(lèi)型1 成員1名; 數(shù)據(jù)類(lèi)型2 成員2名; . . 數(shù)據(jù)類(lèi)型n 成員n名; ; 結(jié)構(gòu)的本質(zhì)是不同類(lèi)型元素
10、的集合 結(jié)構(gòu)型變量的定義和引用結(jié)構(gòu)型變量的定義和引用 結(jié)構(gòu)型變量的定義 方法:先定義結(jié)構(gòu)型、后定義變量 struct student int id; char name20; int age; ; struct student x , y; 結(jié)構(gòu)型變量成員的引用結(jié)構(gòu)型變量成員的引用 引用方法 結(jié)構(gòu)型變量成員的引用方法 引用格式:結(jié)構(gòu)型變量名.成員名 結(jié)構(gòu)型變量成員地址的引用方法 引用格式: char name20; int age; ; 編程練習(xí)編程練習(xí) 學(xué)生管理系統(tǒng): 學(xué)生管理系統(tǒng)可以實(shí)現(xiàn)學(xué)生信息的錄入,查詢(xún),注銷(xiāo)等功 能。 定義學(xué)生的結(jié)構(gòu)體(以后可以按照具體情況增加個(gè)人信息 內(nèi)容) str
11、uct student int id; char name20; int age; ; C語(yǔ)言中的運(yùn)算符語(yǔ)言中的運(yùn)算符 運(yùn)算符運(yùn)算符 什么是運(yùn)算符 用來(lái)表示各種運(yùn)算的符號(hào)稱(chēng)為運(yùn)算符。 運(yùn)算符特點(diǎn) 運(yùn)算符必須有運(yùn)算對(duì)象運(yùn)算對(duì)象,運(yùn)算對(duì)象都有規(guī)定的數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型,同時(shí)運(yùn) 算結(jié)果也有確定的數(shù)據(jù)類(lèi)型。 每個(gè)運(yùn)算符都有自己特定的運(yùn)算規(guī)則運(yùn)算規(guī)則。 當(dāng)表達(dá)式中出現(xiàn)多個(gè)運(yùn)算符時(shí)則必須考慮運(yùn)算符的優(yōu)先級(jí)優(yōu)先級(jí)。 同級(jí)別的運(yùn)算符還規(guī)定了結(jié)合性結(jié)合性。 算術(shù)運(yùn)算符算術(shù)運(yùn)算符 增增1、減、減1運(yùn)算符運(yùn)算符 有哪些運(yùn)算符號(hào) j = i+; 相當(dāng)于 j = I; i= i+1; j = +i; 相當(dāng)于 i = i +
12、1; j = i; 關(guān)系運(yùn)算符關(guān)系運(yùn)算符 關(guān)系運(yùn)算符要點(diǎn)關(guān)系運(yùn)算符要點(diǎn) 關(guān)系運(yùn)算符可以用來(lái)比較兩個(gè)數(shù)值型數(shù)據(jù)的大小,也可以比較 兩個(gè)字符型數(shù)據(jù)的大小。 關(guān)系運(yùn)算符的運(yùn)算結(jié)果是邏輯值,若為“真”用整數(shù)1表示,若 為“假”用整數(shù)0表示。 邏輯運(yùn)算符邏輯運(yùn)算符 邏輯運(yùn)算符的特點(diǎn)邏輯運(yùn)算符的特點(diǎn) 邏輯運(yùn)算符運(yùn)算對(duì)象是數(shù)值型或字符型等;如果是非0表示邏輯 真,0表示邏輯假。 運(yùn)算結(jié)果是邏輯值,如運(yùn)算結(jié)果為真用1表示,若為假則用0表 示。 邏輯運(yùn)算邏輯運(yùn)算 用“ ave=(a+b)/10; 二、賦值結(jié)果和類(lèi)型轉(zhuǎn)換 1、實(shí)型數(shù)據(jù)(包括單、雙精度)賦給整型變量時(shí),舍棄實(shí)數(shù)的小數(shù)部 分。 2、整型數(shù)據(jù)賦給單、雙
13、精度變量時(shí),數(shù)值不變,但以浮點(diǎn)數(shù)形式存 儲(chǔ)到變量中 #include “stdio.h” void main() int i; float f; i=1.23; f=45; printf(“%d %fn”,i,f); 結(jié)果:i=1 f=45.000000 逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式 形式:表達(dá)式1,表達(dá)式2,表達(dá)式n 作用:用于連接表達(dá)式 如:3+5,6-5 計(jì)算過(guò)程: 1、求解表達(dá)式1 2、再求解表達(dá)式2,表達(dá)式n 3、整個(gè)逗號(hào)表達(dá)式的值是表達(dá)式n的值. 一個(gè)逗號(hào)表達(dá)式又可以與另一個(gè) 表達(dá)式組成一個(gè)新的逗號(hào)表達(dá)式。 如;(a=3*5,a*4),a+5 x=a=3,6*a 注
14、意:并不是任何地方出現(xiàn)的 逗號(hào)都是逗號(hào)運(yùn)算符 如:printf(“%d,%dn”,a,b) 條件運(yùn)算符條件運(yùn)算符 該運(yùn)算符是三目運(yùn)算符,其三個(gè)運(yùn)算對(duì)象是表達(dá)式( e1?e2:e3); 運(yùn)算規(guī)則是如果e1表達(dá)式為“真”,取e2表達(dá)式的值,否 則取e3表達(dá)式的值。 位運(yùn)算符位運(yùn)算符 什么是位運(yùn)算 是一種對(duì)運(yùn)算對(duì)象按二進(jìn)制位進(jìn)行操作的運(yùn)算。 位運(yùn)算的特點(diǎn) 位運(yùn)算不允許只操作其中的某一位,而是對(duì)整個(gè)數(shù)據(jù)按二進(jìn)制 位進(jìn)行運(yùn)算; 位運(yùn)算的對(duì)象只能是整型數(shù)據(jù)(包括字符型),運(yùn)算結(jié)果仍是 整型數(shù)據(jù) 位運(yùn)算符分為位邏輯運(yùn)算符、位移位運(yùn)算符、位自反賦值運(yùn)算 符三種 位運(yùn)算符位運(yùn)算符 位移位運(yùn)算符位移位運(yùn)算符 位運(yùn)
15、算符位運(yùn)算符 按位與 0 1 1 0|1=1; 1|0=1; 1|1=1 按位異或 00=0; 01=1; 10=1; 11=0 按位取反 0=1; 1=0; 表達(dá)式表達(dá)式 什么是表達(dá)式 用運(yùn)算符將運(yùn)算對(duì)象連接形成的式子就是表達(dá)式。 表達(dá)式的特點(diǎn) 每個(gè)表達(dá)式都可以按照其中運(yùn)算符的優(yōu)先級(jí)和運(yùn)算規(guī)則依次對(duì)運(yùn) 算對(duì)象進(jìn)行運(yùn)算,最終獲得一個(gè)數(shù)據(jù),該數(shù)據(jù)稱(chēng)為表達(dá)式的值。 表達(dá)式值的數(shù)據(jù)類(lèi)型就稱(chēng)為表達(dá)式的數(shù)據(jù)類(lèi)型。 表達(dá)式的分類(lèi) 主要有六種:算術(shù)表達(dá)式、關(guān)系表達(dá)式、邏輯表達(dá)式、條件表達(dá) 式、賦值表達(dá)式和逗號(hào)表達(dá)式。 表達(dá)式類(lèi)型轉(zhuǎn)換方法表達(dá)式類(lèi)型轉(zhuǎn)換方法 表達(dá)式計(jì)算中數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換原則 特點(diǎn):參加運(yùn)算的
16、各個(gè)數(shù)據(jù)都轉(zhuǎn)換成數(shù)據(jù)長(zhǎng)度最長(zhǎng)的數(shù)據(jù)類(lèi)型, 然后計(jì)算。計(jì)算結(jié)果值當(dāng)然就是數(shù)據(jù)長(zhǎng)度最長(zhǎng)的數(shù)據(jù)類(lèi)型 例如:設(shè)i為int,f為float,d為double,e為long 則10+a+i*f-d/e的結(jié)果是double。 運(yùn)算結(jié)果存入變量時(shí)數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換原則 特點(diǎn):先將運(yùn)算結(jié)果的數(shù)據(jù)類(lèi)型自動(dòng)轉(zhuǎn)換成變量的數(shù)據(jù)類(lèi)型,然 后再賦予該變量 不同類(lèi)型數(shù)據(jù)間的混合運(yùn)算不同類(lèi)型數(shù)據(jù)間的混合運(yùn)算 整型、實(shí)型(包括單、雙精度)、字符型數(shù)據(jù)間可以混合運(yùn)算。如 :10+a+12.3-4.56*x是合法的 運(yùn)算時(shí),不同類(lèi)型的數(shù)據(jù)要先轉(zhuǎn)換成同一類(lèi)型,然后進(jìn)行運(yùn)算。 轉(zhuǎn)換規(guī)則如下: floatdouble long unsig
17、ned int char,short 高 低 float型數(shù)據(jù)在運(yùn)算時(shí)一 律先轉(zhuǎn)換成double型 不同類(lèi)型進(jìn)行混合運(yùn)算時(shí),按照類(lèi) 型級(jí)別由低到高的順序轉(zhuǎn)換 字符型和short型在運(yùn)算時(shí)一律轉(zhuǎn)換 成int型 分支結(jié)構(gòu)程序設(shè)計(jì)分支結(jié)構(gòu)程序設(shè)計(jì) 在C語(yǔ)言中,分支結(jié)構(gòu)主要是利用if語(yǔ)句來(lái)實(shí)現(xiàn)的,if語(yǔ)句 是對(duì)給定的條件進(jìn)行判斷,然后決定執(zhí)行某個(gè)分支。C語(yǔ) 言的if語(yǔ)句有3種形式: if語(yǔ)句 if else語(yǔ)句 else if語(yǔ)句 If語(yǔ)句語(yǔ)句 條件執(zhí)行 一般形式為: If(表達(dá)式)語(yǔ)句 含義:如果表達(dá)式的值為真, 則執(zhí)行其后的語(yǔ)句;否則不執(zhí)行該語(yǔ)句。 語(yǔ)句 表達(dá)式 真(非0) 假(0) If(x0)
18、printf(“hello!”); 例例:輸入兩個(gè)數(shù),輸出其中較大的數(shù)輸入兩個(gè)數(shù),輸出其中較大的數(shù) main() int a,b,max; printf(“n input two numbers:”); scanf(“%d%d”, max=a; if(maxb) max=a;min=b; else max=b;min=a; if(maxc) min=c; printf(“max=%dt min=%dn”,max,min); else-if語(yǔ)句語(yǔ)句 前面兩種形式的if語(yǔ)句一般都用于兩個(gè)分支情況。在實(shí)際程序設(shè)計(jì)時(shí)經(jīng)常需要 進(jìn)行多分支處理,C語(yǔ)言中進(jìn)行多分支處理時(shí),可采用else-if語(yǔ)句實(shí)現(xiàn)。 階
19、梯式的if語(yǔ)句 一般形式 if(表達(dá)式表達(dá)式1) 語(yǔ)句語(yǔ)句1; elseif(表達(dá)式表達(dá)式2) 語(yǔ)句語(yǔ)句2; elseif(表達(dá)式表達(dá)式3) 語(yǔ)句語(yǔ)句3; elseif(表達(dá)式表達(dá)式m) 語(yǔ)句語(yǔ)句m; else語(yǔ)句語(yǔ)句m+1; 含義:依次判斷各個(gè)表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為真時(shí),則執(zhí)行其對(duì)應(yīng)的語(yǔ)句, 然后跳出else-if結(jié)構(gòu)。如果所有的表達(dá)式的值均為假,則執(zhí)行語(yǔ)句m+1,然 后執(zhí)行后續(xù)程序。 表達(dá)式1 語(yǔ)句1 真 真 真 真 表達(dá)式2 表達(dá)式3 表達(dá)式4 語(yǔ)句2語(yǔ)句3語(yǔ)句2語(yǔ)句2 假 假 假 假 例:根據(jù)鍵盤(pán)輸入字符的類(lèi)型并輸出相應(yīng)的信息例:根據(jù)鍵盤(pán)輸入字符的類(lèi)型并輸出相應(yīng)的信息 #inclu
20、de main() char c; printf(input a character:); c=getchar(); if(c=0 else printf(“Ab) max=a; else max=b; 可以采用條件運(yùn)算符實(shí)現(xiàn): max=(ab)?a:b; 條件運(yùn)算符是一個(gè)3目運(yùn)算符,即有3個(gè)參與運(yùn)算的量。由條件運(yùn) 算符組成的表達(dá)式稱(chēng)為條件表達(dá)式: 表達(dá)式1?表達(dá)式2:表達(dá)式3 使用條件表達(dá)式時(shí),還應(yīng)注意以下幾點(diǎn): (1)條件運(yùn)算符的運(yùn)算優(yōu)先級(jí)低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符,但高于 賦值運(yùn)算符。 (2)條件運(yùn)算符?和:是一對(duì)運(yùn)算符,不能分開(kāi)單獨(dú)使用。 (3)條件運(yùn)算符的結(jié)合方向是自右至左。 如:a
21、b?a:cd?c:d 例例:比較兩個(gè)數(shù)的大小并輸出較大值比較兩個(gè)數(shù)的大小并輸出較大值 main( ) int a,b; printf(“n input two numbers:”); scanf(“%d%d”, printf(“max=%d”,ab?a:b); switch-case語(yǔ)句語(yǔ)句 在實(shí)際中經(jīng)常需要處理多分支問(wèn)題,如統(tǒng)計(jì)學(xué)生成績(jī)分布等 ,雖然可以用else-if和嵌套if語(yǔ)句來(lái)實(shí)現(xiàn)多分支程序設(shè)計(jì),但是當(dāng) 分支較多時(shí),程序變得冗長(zhǎng)且可讀性低。在C語(yǔ)言中提供了直接 處理多分支的方法:switch-case語(yǔ)句。 一、格式: switch(表達(dá)式) case常量表達(dá)式1:語(yǔ)句1; case
22、常量表達(dá)式2:語(yǔ)句2; case常量表達(dá)式n:語(yǔ)句n; default :語(yǔ)句n+1; 二、執(zhí)行過(guò)程 1.計(jì)算表達(dá)式的值 2.若與常量表達(dá)式n值一致,則 從該語(yǔ)句開(kāi)始執(zhí)行;直到遇到 break語(yǔ)句或switch語(yǔ)句的 3、若與任何常量表達(dá)式值均不 一致時(shí),則執(zhí)行default語(yǔ)句或 執(zhí)行后續(xù)語(yǔ)句 其中:表達(dá)式可以是整型、字符型、枚舉型 常量表達(dá)式必須與表達(dá)式類(lèi)型一致(整型與字符型通用) 常量表達(dá)式中的數(shù)據(jù)僅起語(yǔ)句標(biāo)號(hào)作用,不作求值判斷 常量表達(dá)式的值必須是唯一的,沒(méi)有先后順序 多個(gè)case語(yǔ)句可以共用一組執(zhí)行語(yǔ)句 循環(huán)結(jié)構(gòu)程序設(shè)計(jì)循環(huán)結(jié)構(gòu)程序設(shè)計(jì) 內(nèi)容提要: 循環(huán)就是在滿(mǎn)足一定條件時(shí)重復(fù)執(zhí)行一
23、段程序 l 概述 l 構(gòu)成循環(huán)的語(yǔ)句 while、do-while、for、if-goto l 循環(huán)結(jié)構(gòu)的比較 l break語(yǔ)句和continue語(yǔ)句 While語(yǔ)句語(yǔ)句 用while語(yǔ)句實(shí)現(xiàn)循環(huán) while語(yǔ)句的一般形式: while (表達(dá)式) 語(yǔ)句; 表達(dá)式 語(yǔ)句 下一語(yǔ)句 假(0) 真(非0) 表達(dá)式 語(yǔ)句 當(dāng)表達(dá)式的值為真(非0)時(shí),執(zhí) 行其中的內(nèi)嵌語(yǔ)句(循環(huán)體),然后回 過(guò)頭來(lái)再判斷表達(dá)式的值,如此重復(fù); 當(dāng)表達(dá)式為假(0)時(shí)結(jié)束循環(huán)。 while語(yǔ)句的一般形式: while (表達(dá)式) 語(yǔ)句; 如:k=1; while(k=100)s+=k;k+; 循環(huán)控制 表達(dá)式 循環(huán)控制
24、變量 循環(huán)體 注意: u 若循環(huán)體包含一條以上的語(yǔ)句,應(yīng)以復(fù)合語(yǔ)句形式出現(xiàn) u 循環(huán)體,必須給循環(huán)控制變量賦值 u 循環(huán)體中,必須有改變循環(huán)控制變量值的語(yǔ)句 (使循環(huán)趨向結(jié)束的語(yǔ)句) u 循環(huán)體可以為空如:while(c=getchar()!=A); 等價(jià):c=getchar(); while(c!=A)c=getchar(); 編程練習(xí):編程練習(xí): 打印100以?xún)?nèi)所有的奇數(shù)(不包括100) 打印100以?xún)?nèi)所有的偶數(shù)(不包括100) 打印100以?xún)?nèi)所有3的倍數(shù),并統(tǒng)計(jì)個(gè)數(shù)。 輸入一個(gè)數(shù),判斷是幾位數(shù)?(使用循環(huán)實(shí)現(xiàn)?。?do-while循環(huán)循環(huán) do-while語(yǔ)句用來(lái)實(shí)現(xiàn)“直到型”循環(huán), 它
25、的一般形式為: do語(yǔ)語(yǔ)句句 While(表達(dá)式表達(dá)式); 不可以省略 切記切記! 語(yǔ)句 表達(dá)式 下一語(yǔ)句 假 真 NS圖 注意點(diǎn)與while相同 for循環(huán)循環(huán) for循環(huán)的一般形式: for(表達(dá)式1;表達(dá)式2;表達(dá)式3) 語(yǔ)句 求解表達(dá)式1 表達(dá)式2 語(yǔ)句 求解表達(dá)式3 下一語(yǔ)句 假 真 求解表達(dá)式1 表達(dá)式2 語(yǔ)句 求解表達(dá)式3 l表達(dá)式1在進(jìn)入循環(huán)之前求解 (循環(huán)變量賦初值) l表達(dá)式3是循環(huán)體的一部分 for循環(huán)的其他形式: for( ;表達(dá)式2; ) 語(yǔ)句 表達(dá)式3; 表達(dá)式1 表達(dá)式1; 表達(dá)式3 表達(dá)式2為空 值永遠(yuǎn)為真 成為死循環(huán) 變量賦 初值 這個(gè)分號(hào) 不能移走 相當(dāng)于循
26、環(huán)體 的一部分 可以移到語(yǔ)句 后面來(lái) 說(shuō)明說(shuō)明 1、表達(dá)式1省略時(shí),應(yīng)在for前給循環(huán)變量賦初值。 如:k=1; for(;k=3;k+) s+=k; 2、表達(dá)式2省略時(shí),不判斷循環(huán)條件,將成為“死循環(huán)”,需要在循環(huán) 體內(nèi)引入break語(yǔ)句以退出循環(huán) 3、表達(dá)式3省略時(shí),循環(huán)體內(nèi)應(yīng)有使循環(huán)條件改變的語(yǔ)句 如:for(k=1;k=3; )s+=k;k+; 4、同時(shí)省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,此時(shí)相當(dāng)于while語(yǔ)句。 如: k=1;k=1; for(;k=3;)while(k=3) s+=k;k+s+=k;k+ 5、表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可以是數(shù)值表達(dá)式或 字符表達(dá)
27、式,只要其值不等于0就執(zhí)行循體 如: for(k=1;k-4;k+)s+=k; 僅當(dāng)k的值等于4的時(shí)候終止循環(huán)。k-4是數(shù)值表達(dá)式。 求求100以?xún)?nèi)的奇數(shù)、偶數(shù)之和以?xún)?nèi)的奇數(shù)、偶數(shù)之和 循環(huán)的嵌套循環(huán)的嵌套 u 一個(gè)循環(huán)體內(nèi)包含著另一個(gè)完整的循環(huán)結(jié)構(gòu),就稱(chēng)為循環(huán)嵌套 u 內(nèi)嵌的循環(huán)中又可以嵌套循環(huán),從而構(gòu)成多重循環(huán)。 u 三種循環(huán)可以互相嵌套 下面給出幾種合法的嵌套形式: (1)while嵌套while(2)do-while嵌套do-while while()do while()do while(); while(); (3)for嵌套for(4)while嵌套do-while for(;)w
28、hile() for(;)do while(); (5)for嵌套while(6)do-while嵌套for for(;)do while()for; while(); 循環(huán)嵌套的說(shuō)明循環(huán)嵌套的說(shuō)明 l 嵌套的循環(huán)控制變量不能相同 l 內(nèi)循環(huán)變化快,快循環(huán)變化慢 l 正確確定循環(huán)體 l 循環(huán)控制變量常與求解的問(wèn)題掛鉤 有有1、2、3、4個(gè)數(shù)字,能組成多少個(gè)互不個(gè)數(shù)字,能組成多少個(gè)互不 相同且無(wú)重復(fù)數(shù)字的三位數(shù)?都是多少相同且無(wú)重復(fù)數(shù)字的三位數(shù)?都是多少? main() int i,j,k; printf(n); for(i=1;i5;i+)*以下為三重循環(huán)*/ for(j=1;j5;j+) f
29、or (k=1;k5;k+) if (i!=k 幾種循環(huán)的比較幾種循環(huán)的比較 一、關(guān)于循環(huán)的控制 循環(huán)控制條件 修改循環(huán)條件 循環(huán)條件初始化 break語(yǔ)句和語(yǔ)句和continue語(yǔ)句語(yǔ)句 一、break語(yǔ)句 用break語(yǔ)句可以結(jié)束switch結(jié)構(gòu)和三種循環(huán)、 for(n=1;n1000) break; printf(“%f”,n); 二、continue語(yǔ)句 用continue語(yǔ)句可以結(jié)束本次循環(huán),既忽略循環(huán)體中剩余語(yǔ)句。 如:把100200之間不能被3整除的數(shù)輸出 本次循環(huán)結(jié)束 循環(huán)體的剩余語(yǔ)句被忽略 執(zhí)行表達(dá)式3,進(jìn)下一循環(huán) continue總是作if的內(nèi)嵌語(yǔ)句 通用轉(zhuǎn)移語(yǔ)句通用轉(zhuǎn)移語(yǔ)
30、句goto語(yǔ)句語(yǔ)句 Goto語(yǔ)句隨意跳轉(zhuǎn)到任意位置 Goto語(yǔ)句一般配合標(biāo)號(hào)語(yǔ)句使用 Goto語(yǔ)句容易導(dǎo)致代碼混亂 精心設(shè)計(jì)的goto語(yǔ)句可以帶來(lái)代碼的高效 Goto語(yǔ)句在嵌入式編程中用的很多 3.1.3 C語(yǔ)言知識(shí)精編語(yǔ)言知識(shí)精編 關(guān)鍵詞關(guān)鍵詞 3.1.3 C語(yǔ)言知識(shí)精編語(yǔ)言知識(shí)精編 預(yù)處理預(yù)處理 “預(yù)處理”是指在對(duì)C語(yǔ)言源程序進(jìn)行編譯之前,要先對(duì)程 序中的“宏定義、文件包含、條件編譯”等特殊命令進(jìn)行 預(yù)先處理。 宏定義:定義一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱(chēng)為“宏定 義”,該標(biāo)識(shí)符稱(chēng)為“宏名”。在編譯預(yù)處理時(shí),對(duì)程序 中所有出現(xiàn)的“宏名”的地方都用字符串去代換。 宏定義分類(lèi):分為有參數(shù)宏定義和
31、無(wú)參數(shù)宏定義兩種。 宏的定義 不帶參數(shù)的宏定義 宏定義的宏定義的一般格式一般格式為:為: #define 文本串文本串 /*#define就是宏定義命令就是宏定義命令*/ 功能:功能:將宏名的值定義為指定的文本串。將宏名的值定義為指定的文本串。 在預(yù)處理時(shí)凡出現(xiàn)宏名的地方在預(yù)處理時(shí)凡出現(xiàn)宏名的地方,都用指定的文本串替換。都用指定的文本串替換。 在預(yù)處理時(shí)將宏名替換成指定的文本串的過(guò)程稱(chēng)為在預(yù)處理時(shí)將宏名替換成指定的文本串的過(guò)程稱(chēng)為“宏展開(kāi)宏展開(kāi)”, 或稱(chēng)為或稱(chēng)為“宏替換宏替換”。 【例】 求圓周長(zhǎng)、面積和相同半徑圓球體積。 #define PI 3.14159 void main() floa
32、t r,l,s,v; printf(“input radius:”); scanf(“%f”, l=2.0*PI*r; s=PI*r*r; v=3.0/4*PI*r*r*r; printf(“l(fā)=%6.2fns=%6.2fnv=%6.2fn”,l,s,v); 程序運(yùn)行結(jié)果:程序運(yùn)行結(jié)果: input radius:6 l= 37.70 s=113.10 v=508.94 注意: (1) 宏名為了與變量名區(qū)別一般用大寫(xiě)字母表示。宏名為了與變量名區(qū)別一般用大寫(xiě)字母表示。 (2) 宏展開(kāi)時(shí)只用文本串替換宏名,不作正確性檢查。宏展開(kāi)時(shí)只用文本串替換宏名,不作正確性檢查。 (3) 宏定義行末尾不能加分號(hào)
33、。加分號(hào),宏展時(shí)會(huì)當(dāng)作文宏定義行末尾不能加分號(hào)。加分號(hào),宏展時(shí)會(huì)當(dāng)作文 本串字符一同代入。本串字符一同代入。 (4) 宏名的有效范圍是:從定義位置開(kāi)始到本文件結(jié)束宏名的有效范圍是:從定義位置開(kāi)始到本文件結(jié)束 (5) 可以用可以用#undef命令終止宏定義的作用域。命令終止宏定義的作用域。 (6) 在宏定義時(shí),可以引用已定義的宏名。在宏定義時(shí),可以引用已定義的宏名。 【例】在宏定義時(shí)引用已定義的宏名 #define R 4.0 #define PI 3.14159 #define L 2*PI*R #define S PI*R*R void main() printf(“L=%6.2fnS=%6
34、.2fn”,L,S); 運(yùn)行運(yùn)行結(jié)結(jié)果如下:果如下: L= 25.13 S= 50.27 【例】分析下列程序【例】分析下列程序 #define OK 100 void main() printf(OK); printf(n); 運(yùn)行運(yùn)行結(jié)結(jié)果果為為: : OK 為為什么不是什么不是100? 帶參數(shù)的宏定義 帶參數(shù)的宏定義格式如下: #define (參數(shù)表) 文本串 功能:定義一個(gè)帶參數(shù)的宏。 例如: #define S(x,y) 3*x+2*y area=S(3,2); 宏展開(kāi):用實(shí)參從左到右逐個(gè)字符進(jìn)行替換文本串中的形 參字符。如圖8.1所示。 執(zhí)行:area=S(3,2) 宏展開(kāi)后變成:
35、 area=3*3+2*2; 【例】 求圓的面積。 #define PI 3.14159 #define S(r) PI*r*r void main() float a,area; a=3.6; area=S(a); printf(“area=%6.2fn”,area); 運(yùn)行運(yùn)行結(jié)結(jié)果:果: area= 40.72 說(shuō)說(shuō)明:明: (1) 宏名與括弧之宏名與括弧之間間不能有空格。不能有空格。 (2) 宏宏調(diào)調(diào)用用時(shí)時(shí), ,實(shí)實(shí)參的個(gè)數(shù)必參的個(gè)數(shù)必須須與形參的個(gè)與形參的個(gè) 數(shù)相同。數(shù)相同。 (3) 帶帶參數(shù)的宏替參數(shù)的宏替換時(shí)換時(shí)不作不作語(yǔ)語(yǔ)法法檢查檢查。 。 (4) 宏定宏定義時(shí)義時(shí)最好在參數(shù)
36、兩最好在參數(shù)兩側(cè)側(cè)加括號(hào)和整加括號(hào)和整 個(gè)字符串外加括號(hào),防止宏替?zhèn)€字符串外加括號(hào),防止宏替換換出出錯(cuò)錯(cuò)。 。 【例】分析以下程序運(yùn)行結(jié)果 #define SQ(y) (y)*(y) void main() int a,sq; printf(input a number: ); scanf(%d, sq=160/SQ(a+1); printf(sq=%dn,sq); 比較下面【例6】和【例7】程序的不同之處。 【例【例6】 】 #define SQ(y) y*y void main() int a,sq; printf(input a number: ); scanf(%d, sq=SQ(a+
37、1); printf(sq=%dn,sq); 運(yùn)行運(yùn)行結(jié)結(jié)果果為為: : input a number:3 sq=7 /*宏代宏代換換后得到:后得到:sq=a+1*a+1; ; */ 【例【例7】 】 #define SQ(y) (y)*(y) void main() int a,sq; printf(input a number: ); scanf(%d, sq=SQ(a+1); printf(sq=%dn,sq); 運(yùn)行運(yùn)行結(jié)結(jié)果果為為: : input a number:3 sq=16 /*宏代宏代換換后得到:后得到:sq=(a+1)*(a+1); */ 宏調(diào)用和函數(shù)調(diào)用的主要區(qū)別: 帶
38、參宏函數(shù) 處理過(guò)程 不分配內(nèi)存 簡(jiǎn)單的字符置換 分配內(nèi)存 先求實(shí)參值,再代入形參 處理時(shí)間編譯時(shí)程序運(yùn)行時(shí) 參數(shù)類(lèi)型 無(wú)類(lèi)型問(wèn)題 定義實(shí)參,形參類(lèi)型 程序長(zhǎng)度 變長(zhǎng)不變 運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間 文件包含:就是將指定文件全部?jī)?nèi)容包含(裝入)到本文件 中來(lái)。 一般格式: #include“文件名文件名” 或或 #include 功能: 將指定的源文件全部?jī)?nèi)容包含進(jìn)來(lái),即裝入將指定的源文件全部?jī)?nèi)容包含進(jìn)來(lái),即裝入#include命令所命令所 處位置上使其成為一個(gè)程序。處位置上使其成為一個(gè)程序。 2 文件包含文件包含 對(duì)文件包含命令還要說(shuō)明以下幾點(diǎn): 1.指定文件名可以用雙引號(hào)或尖括號(hào)括
39、起來(lái)。指定文件名可以用雙引號(hào)或尖括號(hào)括起來(lái)。 例如:例如: #includestdio.h #include 二者的區(qū)別:二者的區(qū)別: 用尖括弧時(shí),直接在庫(kù)函數(shù)頭文件目錄中查找包含文件,稱(chēng)用尖括弧時(shí),直接在庫(kù)函數(shù)頭文件目錄中查找包含文件,稱(chēng) 為標(biāo)準(zhǔn)方式;為標(biāo)準(zhǔn)方式; 用雙引號(hào)時(shí),在用戶(hù)當(dāng)前目錄中尋找包含的文件,若找不到用雙引號(hào)時(shí),在用戶(hù)當(dāng)前目錄中尋找包含的文件,若找不到 ,再按標(biāo)準(zhǔn)方式查找。,再按標(biāo)準(zhǔn)方式查找。 一般情況下:包含庫(kù)函數(shù)用尖括弧節(jié)省時(shí)間;一般情況下:包含庫(kù)函數(shù)用尖括弧節(jié)省時(shí)間; 包含用戶(hù)自己編寫(xiě)的文件用雙引號(hào)。包含用戶(hù)自己編寫(xiě)的文件用雙引號(hào)。 2. 一個(gè)一個(gè)#include命令只
40、能指定一個(gè)被包含文件。命令只能指定一個(gè)被包含文件。 3. 文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含 另一個(gè)文件。另一個(gè)文件。 功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái) 一般形式: #include “文件名” 或 #include #include “file2.c” file1.c file2.c file1.c file2.c A B A 處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命 令,再對(duì)“包含”后的文件作一個(gè)源文件編譯 直接按標(biāo)準(zhǔn)目錄搜索 “” 先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄 可指定路徑 文件包含文件包含
41、 源文件(*.c) 頭文件(*.h) 宏定義 數(shù)據(jù)結(jié)構(gòu)定義 函數(shù)說(shuō)明等 文件包含可嵌套 #include “file2.c” file1.c A file3.c C #include “file3.c” file2.c B file1.c A file3.c file2.c被包含文件內(nèi)容被包含文件內(nèi)容 /* powers.h */ #define sqr(x) (x)*(x) #define cube(x) (x)*(x)*(x) #define quad(x) (x)*(x)*(x)*(x) /*a.c*/ #include #include “powers.h #define MAX_PO
42、WER 10 void main() int n; printf(numbert exp2t exp3t exp4n); printf(-t-t-t-n); for(n=1;n=MAX_POWER;n+) printf(%2dt %3dt %4dt %5dn,n,sqr(n),cube(n),quad(n); 例例 文件包含舉例文件包含舉例 【例8】給定半徑,計(jì)算圓的周長(zhǎng)和圓的面積。 設(shè)計(jì)三個(gè)包含文件,或稱(chēng)為頭文件: 第第1個(gè)為:個(gè)為:myin1.h #include #define PI 3.14159 第第2個(gè)為:個(gè)為:myin2.h float getlen(float r) retur
43、n 2*getsr(r)/r; 第第3個(gè)為:個(gè)為:myin3.h float getsr(float r) return PI*r*r; 主函數(shù)的程序如下:主函數(shù)的程序如下: #include “myin1.h” #include “myin3.h” #include “myin2.h” void main() float x=3.0; printf(“L=%fn”,getlen(x); printf(“S=%fn”,getsr(x); 因因?yàn)闉椋汉瘮?shù)的:函數(shù)的調(diào)調(diào)用關(guān)系,用關(guān)系,頭頭文件的包含文件的包含順順序序應(yīng)該應(yīng)該必必須須是:是:myin1.h, 然后然后myin3.h,最后是最后是my
44、in2.h。 。 一般情況下,對(duì)源程序進(jìn)行全部編譯。 條件編譯:根據(jù)具體條件和需要只編譯源程序中的某些部 分為條件編譯。 條件編譯用途:可以用源程序產(chǎn)生不同版本。 3 條件條件編譯編譯 1條件編譯的三種形式: 形式一:形式一: #ifdef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1 #else 程序段程序段2 #endif 功能:標(biāo)識(shí)符已被功能:標(biāo)識(shí)符已被 #define命令定義過(guò)則對(duì)程序段命令定義過(guò)則對(duì)程序段1進(jìn)行編譯;否則進(jìn)行編譯;否則 對(duì)程序段對(duì)程序段2進(jìn)行編譯。進(jìn)行編譯。 形式二:形式二: #ifndef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1 #else 程序段程序段2 #endif 功能:如果標(biāo)識(shí)符未被
45、功能:如果標(biāo)識(shí)符未被#define命令定義過(guò)則對(duì)程序段命令定義過(guò)則對(duì)程序段1進(jìn)行編譯,進(jìn)行編譯, 否則對(duì)程序段否則對(duì)程序段2進(jìn)行編譯。進(jìn)行編譯。 形式三:形式三: #if 常量表達(dá)式常量表達(dá)式 程序段程序段1 #else 程序段程序段2 #endif 功能是,如常量表達(dá)式的值為真功能是,如常量表達(dá)式的值為真(非非0),則對(duì)程序段,則對(duì)程序段1 進(jìn)行編譯,否進(jìn)行編譯,否 則對(duì)程序段則對(duì)程序段2進(jìn)行編譯。進(jìn)行編譯。 #include #define LETTER 0 int main( ) char str = C language; char c; int i; for (i = 0; stri
46、 != 0; i+) c = stri; #if LETTER if (c=a #endif printf(%c,c); putchar(n); return 0; 運(yùn)行結(jié)果: C LANGUAGE 上題如果將第一行改 為:#define LETTER 0 則在預(yù)處理時(shí),對(duì)第二個(gè) IF語(yǔ)句處理,使大寫(xiě)變?yōu)?小寫(xiě)。 目的:掌握宏定義、宏調(diào)用,以及宏展的處理過(guò)程,掌握文件 包含的概念和使用。 實(shí)訓(xùn)內(nèi)容: 1試分析以下宏替換后的形式,計(jì)算輸出結(jié)果。試分析以下宏替換后的形式,計(jì)算輸出結(jié)果。 要求:先計(jì)算運(yùn)行結(jié)果,然后利用程序驗(yàn)證。要求:先計(jì)算運(yùn)行結(jié)果,然后利用程序驗(yàn)證。 #include #defin
47、e CX(y) 2.5+y #define PR(a) printf(%d,(int)(a) #define PR1(a) PR(a); putchar(n) int main(void) int x=2; PR1(CX(5)*x); return 0; 5練習(xí)練習(xí) 2.寫(xiě)出下面程序的運(yùn)行結(jié)果 ( (2) ) #define M 3 #define N M+1 #define NN N*N/2 int main( ) printf(“%dn”, NN) printf(“%dn”, 5*NN) ; ( (1) ) #define min(x, y) x str_cpy(char *src, ch
48、ar *des) l數(shù)組作為函數(shù)返回值,必須通過(guò)指針實(shí)現(xiàn)數(shù)組作為函數(shù)返回值,必須通過(guò)指針實(shí)現(xiàn) char *str_cpy(char *src, char *des) 數(shù)數(shù)組組與指與指針針 2、指針數(shù)組:即數(shù)組的元素為指針類(lèi)型。、指針數(shù)組:即數(shù)組的元素為指針類(lèi)型。 char* var10; /10個(gè)個(gè)int型指針的數(shù)組型指針的數(shù)組 sizeof(var) = ? var + 1 ? 3、數(shù)組指針:即指針的類(lèi)型為數(shù)組(指向數(shù)組的指針)。、數(shù)組指針:即指針的類(lèi)型為數(shù)組(指向數(shù)組的指針)。 char (*var)10; /指向指向10個(gè)個(gè)int型數(shù)組的指針型數(shù)組的指針 sizeof(var) = ?
49、var + 1 ? 4、字符串與指針、字符串與指針 l字符串是屬于典型的字符數(shù)組,因而通常通過(guò)字符串是屬于典型的字符數(shù)組,因而通常通過(guò)char型指針處理字符串型指針處理字符串 數(shù)數(shù)組組與指與指針針 l將字符串直接賦值給指針,表示指針指向字符串內(nèi)存首地址將字符串直接賦值給指針,表示指針指向字符串內(nèi)存首地址 注意:字符串常量?jī)?nèi)存分配在只讀數(shù)據(jù)區(qū)(注意:字符串常量?jī)?nèi)存分配在只讀數(shù)據(jù)區(qū)(RODATA) 實(shí)例:實(shí)例:char *p = “xnf”; char arr = “xnf”; *p ? *p+ ? *+p ? *p = X ? arr0 = X ? strcpy(p, “XNF”) ? strc
50、py(arr, “XNF”) ? 數(shù)數(shù)組組與指與指針針 l通過(guò)指針數(shù)組表示字符串?dāng)?shù)組通過(guò)指針數(shù)組表示字符串?dāng)?shù)組 char a16 = “welcome”, “to”, “xnf”; 主函數(shù)參數(shù)就是通過(guò)指針數(shù)組實(shí)現(xiàn)的主函數(shù)參數(shù)就是通過(guò)指針數(shù)組實(shí)現(xiàn)的: int main (int argc, char *argv) 結(jié)結(jié)構(gòu)與指構(gòu)與指針針 1、結(jié)構(gòu)包含指針:結(jié)構(gòu)體中包含指針域變量、結(jié)構(gòu)包含指針:結(jié)構(gòu)體中包含指針域變量 如:學(xué)生信息中如:學(xué)生信息中name與與phone定義為指針定義為指針 注意:在程序中動(dòng)態(tài)修改學(xué)生信息表中的注意:在程序中動(dòng)態(tài)修改學(xué)生信息表中的 name和和phone域可行么?域可行
51、么? 結(jié)結(jié)構(gòu)與指構(gòu)與指針針 2、指向結(jié)構(gòu)體的指針、指向結(jié)構(gòu)體的指針 結(jié)構(gòu)體變量域通過(guò)結(jié)構(gòu)體變量域通過(guò).訪問(wèn),而結(jié)構(gòu)體指針域通過(guò)訪問(wèn),而結(jié)構(gòu)體指針域通過(guò)-訪問(wèn)訪問(wèn) sizeof(info) = ? sizeof(p) = ? 下面這段代碼錯(cuò)在哪里?下面這段代碼錯(cuò)在哪里? 結(jié)結(jié)構(gòu)與指構(gòu)與指針針 通過(guò)結(jié)構(gòu)體指針傳遞參數(shù)通過(guò)結(jié)構(gòu)體指針傳遞參數(shù)比直接傳遞結(jié)構(gòu)體變量比直接傳遞結(jié)構(gòu)體變量更高效更高效 實(shí)參傳遞給形參時(shí)只拷貝了實(shí)參傳遞給形參時(shí)只拷貝了4個(gè)字節(jié)個(gè)字節(jié) 指指針針與指與指針針 1、指向指針變量的指針、指向指針變量的指針 int i = 100; int *p = int *pp = 實(shí)現(xiàn)指針二級(jí)訪問(wèn)
52、實(shí)現(xiàn)指針二級(jí)訪問(wèn): 函數(shù)與指函數(shù)與指針針 1、指針作為函數(shù)的參數(shù)、指針作為函數(shù)的參數(shù) l向函數(shù)傳遞數(shù)組、字符串、結(jié)構(gòu)向函數(shù)傳遞數(shù)組、字符串、結(jié)構(gòu): 如如strc_py、show_info l作為函數(shù)的作為函數(shù)的輸出參數(shù)輸出參數(shù) 例如:實(shí)現(xiàn)交換兩個(gè)整數(shù)的函數(shù)例如:實(shí)現(xiàn)交換兩個(gè)整數(shù)的函數(shù) void swap(int a, int b) 傳值,形參值改變并不能帶回給實(shí)傳值,形參值改變并不能帶回給實(shí) 參參 傳址,在函數(shù)內(nèi)改變地址內(nèi)保存的傳址,在函數(shù)內(nèi)改變地址內(nèi)保存的 內(nèi)容內(nèi)容 函數(shù)與指函數(shù)與指針針 問(wèn)題:?jiǎn)栴}: 要在函數(shù)能改變指針的值,怎么通過(guò)輸出參數(shù)返回?要在函數(shù)能改變指針的值,怎么通過(guò)輸出參數(shù)返回
53、? 例如:例如: void get_mem(char *pmem, int size) pmem = malloc(size); 動(dòng)態(tài)分配的內(nèi)存能通過(guò)動(dòng)態(tài)分配的內(nèi)存能通過(guò)pmem帶回么?帶回么? 不能!要將實(shí)參指針的地址傳遞給形參(二級(jí)指針)才能實(shí)現(xiàn)不能!要將實(shí)參指針的地址傳遞給形參(二級(jí)指針)才能實(shí)現(xiàn)! 更直接的方法是通過(guò)函數(shù)返回值實(shí)現(xiàn)更直接的方法是通過(guò)函數(shù)返回值實(shí)現(xiàn) 函數(shù)與指函數(shù)與指針針 2、指針作為函數(shù)的返回值、指針作為函數(shù)的返回值 返回字符串、動(dòng)態(tài)分配的內(nèi)存等,如返回字符串、動(dòng)態(tài)分配的內(nèi)存等,如 *strcpy, *malloc 注意注意返回地址的有效性返回地址的有效性(函數(shù)執(zhí)行完畢后
54、該地址未被回收)(函數(shù)執(zhí)行完畢后該地址未被回收) 下面兩個(gè)函數(shù)哪個(gè)是合法的?下面兩個(gè)函數(shù)哪個(gè)是合法的? 函數(shù)與指函數(shù)與指針針 3、指向函數(shù)的指針、指向函數(shù)的指針 函數(shù)存放在函數(shù)存放在TEXT段,同樣具有地址段,同樣具有地址 函數(shù)名就是函數(shù)在函數(shù)名就是函數(shù)在TEXT段的入口地址段的入口地址 跟數(shù)組名一樣,跟數(shù)組名一樣,函數(shù)名也可以看作是一個(gè)指針常量函數(shù)名也可以看作是一個(gè)指針常量 所以,函數(shù)名也可以賦值給指針變量,所以,函數(shù)名也可以賦值給指針變量,那么該指針變量類(lèi)型呢?那么該指針變量類(lèi)型呢? 函數(shù)指針類(lèi)型!函數(shù)指針類(lèi)型!通過(guò)函數(shù)指針,也可以通過(guò)函數(shù)指針,也可以間接調(diào)用函數(shù)間接調(diào)用函數(shù)。 函數(shù)與指函
55、數(shù)與指針針 函數(shù)指針的應(yīng)用:函數(shù)指針的應(yīng)用: 1、作為函數(shù)參數(shù)實(shí)現(xiàn)、作為函數(shù)參數(shù)實(shí)現(xiàn)回調(diào)函數(shù)回調(diào)函數(shù) 所謂回調(diào)函數(shù)是指通過(guò)調(diào)用其他函數(shù)反所謂回調(diào)函數(shù)是指通過(guò)調(diào)用其他函數(shù)反 過(guò)來(lái)調(diào)用某個(gè)函數(shù)過(guò)來(lái)調(diào)用某個(gè)函數(shù) 模擬面向?qū)ο蟮亩鄳B(tài),在模擬面向?qū)ο蟮亩鄳B(tài),在UI組件的大量組件的大量 使使 用用 函數(shù)與指函數(shù)與指針針 2、作為結(jié)構(gòu)體的、作為結(jié)構(gòu)體的動(dòng)作域動(dòng)作域 模擬面向?qū)ο蟮念?lèi),在模擬面向?qū)ο蟮念?lèi),在Linux內(nèi)核中大量使用內(nèi)核中大量使用 作為一個(gè)現(xiàn)實(shí)中的對(duì)象,不但有數(shù)據(jù)屬性,還需要有作為一個(gè)現(xiàn)實(shí)中的對(duì)象,不但有數(shù)據(jù)屬性,還需要有行為屬性行為屬性 使用對(duì)象行為使用對(duì)象行為 3.2 Cortex-M3微控
56、制器軟件接口標(biāo)準(zhǔn)微控制器軟件接口標(biāo)準(zhǔn) 什么是CMSIS u微控制器軟件接口標(biāo)準(zhǔn),即 u(Cortex Microcontroller Software Interface Standard, CMSIS) 為什么推出CMSIS u一個(gè)ARM內(nèi)核會(huì)授權(quán)給多個(gè)廠家,生產(chǎn)種類(lèi)繁多的產(chǎn)品開(kāi) 發(fā)者增加了軟件開(kāi)發(fā)成本 u將所有Cortex芯片廠商產(chǎn)品的軟件接口標(biāo)準(zhǔn)化,制定了 CMSIS標(biāo)準(zhǔn)。 u芯片廠商就能夠?qū)⑺麄兊馁Y源專(zhuān)注于產(chǎn)品外設(shè)特性的差異 化,從而達(dá)到降低開(kāi)發(fā)成本的目的。 3.2 Cortex-M3微控制器軟件接口標(biāo)準(zhǔn)微控制器軟件接口標(biāo)準(zhǔn) CMSIS 軟 件 架 構(gòu) 3.2 Cortex-M3微控制
57、器軟件接口標(biāo)準(zhǔn)微控制器軟件接口標(biāo)準(zhǔn) CMSIS層由三部分構(gòu)成 u(1) 核內(nèi)外設(shè)訪問(wèn)層(CPAL,Core Peripheral Access Layer):該層 由ARM 負(fù)責(zé)實(shí)現(xiàn)。包括對(duì)寄存器名稱(chēng)、地址的定義,對(duì)核寄存器、NVIC 、調(diào)試子系統(tǒng)的訪問(wèn)接口定義以及對(duì)特殊用途寄存器的訪問(wèn)接口(例如: CONTROL,xPSR)定義。 u(2) 片上外設(shè)訪問(wèn)層(DPAL, Device Peripheral Access Layer):該層 由芯片廠商負(fù)責(zé)實(shí)現(xiàn)。該層的實(shí)現(xiàn)與CPAL 類(lèi)似,負(fù)責(zé)對(duì)硬件寄存器地址 以及外設(shè)訪問(wèn)接口進(jìn)行定義。該層可調(diào)用CPAL 層提供的接口函數(shù)同時(shí)根 據(jù)設(shè)備特性對(duì)異常
58、向量表進(jìn)行擴(kuò)展,以處理相應(yīng)外設(shè)的中斷請(qǐng)求。 u(3) 外設(shè)訪問(wèn)函數(shù)(AFP, Access Functions for Peripherals):該層也 由芯片廠商負(fù)責(zé)實(shí)現(xiàn),主要是提供訪問(wèn)片上外設(shè)的訪問(wèn)函數(shù),這一部分是 可選的。 概述 uSTM32標(biāo)準(zhǔn)外設(shè)庫(kù)之前的版本也稱(chēng)固件函數(shù)庫(kù)或簡(jiǎn)稱(chēng)固件庫(kù),是一個(gè) 固件函數(shù)包,它由程序、數(shù)據(jù)結(jié)構(gòu)和宏組成,包括了微控制器所有外設(shè)的 性能特征。 u每個(gè)外設(shè)驅(qū)動(dòng)都由一組函數(shù)組成,這組函數(shù)覆蓋了該外設(shè)所有功能。每 個(gè)器件的開(kāi)發(fā)都由一個(gè)通用API (application programming interface 應(yīng)用 編程界面)驅(qū)動(dòng),API對(duì)該驅(qū)動(dòng)程序的結(jié)構(gòu),函
59、數(shù)和參數(shù)名稱(chēng)都進(jìn)行了標(biāo)準(zhǔn) 化。 uST公司2007年10月發(fā)布了V1.0版本的固件庫(kù),MDK ARM3.22之前的 版本均支持該庫(kù)。2008年6月發(fā)布了V2.0版的固件庫(kù),從2008年9月推出 的MDK ARM3.23版本至今均使用V2.0版本的固件庫(kù)。V3.0以后的版本相 對(duì)之前的版本改動(dòng)較大,本書(shū)使用目前較新的V3.4版本。 STM32F10 x標(biāo)準(zhǔn)外設(shè)庫(kù) 概述 uSTM32標(biāo)準(zhǔn)外設(shè)庫(kù)之前的版本也稱(chēng)固件函數(shù)庫(kù)或簡(jiǎn)稱(chēng)固件庫(kù),是一個(gè) 固件函數(shù)包,它由程序、數(shù)據(jù)結(jié)構(gòu)和宏組成,包括了微控制器所有外設(shè)的 性能特征。 u每個(gè)外設(shè)驅(qū)動(dòng)都由一組函數(shù)組成,這組函數(shù)覆蓋了該外設(shè)所有功能。每 個(gè)器件的開(kāi)發(fā)都由一個(gè)通用API (application programming interface 應(yīng)用 編程界面)驅(qū)動(dòng),API對(duì)該驅(qū)動(dòng)程序的結(jié)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)品組合管理
- 幼小銜接培訓(xùn)老師
- 醫(yī)院冬季消防法律培訓(xùn)
- 銷(xiāo)售月度工作總結(jié)及計(jì)劃
- 兒童哮喘護(hù)理
- 表單填寫(xiě)說(shuō)明培訓(xùn)
- 有效溝通機(jī)制培訓(xùn)
- 職業(yè)教育管理學(xué)理論與實(shí)踐
- 肢體無(wú)力護(hù)理查房
- 子宮頸癌護(hù)理診斷
- CNC機(jī)加工作業(yè)指導(dǎo)書(shū)
- HALCON編程基礎(chǔ)與工程應(yīng)用全書(shū)ppt課件匯總(完整版)
- 冀教版小學(xué)美術(shù)六年級(jí)下冊(cè)教案
- 《一級(jí)學(xué)科下屬專(zhuān)業(yè)證明模板》
- 信陽(yáng)市平橋區(qū)農(nóng)村土地承包經(jīng)營(yíng)權(quán)轉(zhuǎn)包
- 《城市軌道交通通風(fēng)與空調(diào)系統(tǒng)》教學(xué)課件—07地鐵通風(fēng)空調(diào)概述
- Stein-膀胱癌淋巴清掃資料課件
- 小柳樹(shù)和小棗樹(shù)(1)
- 市場(chǎng)營(yíng)銷(xiāo)學(xué)期末復(fù)習(xí)題知識(shí)分享
- 化學(xué)常用單詞匯總
- 大客戶(hù)銷(xiāo)售實(shí)戰(zhàn)技巧PPT
評(píng)論
0/150
提交評(píng)論