第3章-stm32單片機(jī)C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)匯總課件_第1頁(yè)
第3章-stm32單片機(jī)C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)匯總課件_第2頁(yè)
第3章-stm32單片機(jī)C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)匯總課件_第3頁(yè)
第3章-stm32單片機(jī)C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)匯總課件_第4頁(yè)
第3章-stm32單片機(jī)C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)匯總課件_第5頁(yè)
已閱讀5頁(yè),還剩149頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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)化系 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通用輸入輸出GPIO5 STM32外部中斷6 STM32通用定時(shí)器7 STM32通用同步/異步收發(fā)器USART8 直接存儲(chǔ)器存取DMA9 STM32的模數(shù)轉(zhuǎn)換器ADC10 STM32的集成電路總線I2C11 STM32的串行外設(shè)接口SPI第3章 基于標(biāo)準(zhǔn)外設(shè)庫(kù)的C語(yǔ)言程序設(shè)計(jì)基礎(chǔ)3.1 嵌入式C語(yǔ)言基礎(chǔ)文件結(jié)構(gòu)、程序板式、C語(yǔ)言知識(shí)精編3.2 CMSISCortex-M3微控制器軟件接口標(biāo)準(zhǔn)CMSIS概述、STM32F10 x

2、標(biāo)準(zhǔn)外設(shè)庫(kù)3.3 基于MDK的STM32開(kāi)發(fā)退出C語(yǔ)言的特點(diǎn)1、語(yǔ)言簡(jiǎn)單、緊湊、靈活。(32個(gè)關(guān)鍵字,9種控制語(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ǔ) 3.1 嵌入式C語(yǔ)言基礎(chǔ) 每個(gè)C程序通常分為兩個(gè)文件,一個(gè)文件用于保存程序的聲明,稱為頭文件,以“.h”為后綴。另一個(gè)文件用于保存程序的實(shí)現(xiàn),稱為源文件,以“.c”為后綴。如果一個(gè)工程中頭文件數(shù)目較多,通常將頭文件和源文件分別保存在不同的目錄以便于維護(hù)。例如可以將頭文件保存于inc目錄,源文件保存于src

3、目錄。退出版權(quán)和版本聲明/* Copyright (c) 2014,燕山大學(xué)電氣工程學(xué)院* All rights reserved.* 文件名稱:filename.h* 摘 要:簡(jiǎn)要描述本文件的內(nèi)容* 當(dāng)前版本:1.1* 作 者:輸入作者(或修改者)名字* 完成日期:2014年7月20日* 取代版本:1.0 * 原作者 :輸入原作者(或修改者)名字* 完成日期:2014年1月10日*/頭文件結(jié)構(gòu)頭文件版權(quán)和版本聲明、預(yù)處理塊和函數(shù)聲明/ 版權(quán)和版本聲明#ifndef_GRAPHICS_H_#define_GRAPHICS_H_#include #include “myheader.h” / 引

4、用非標(biāo)準(zhǔn)庫(kù)的頭文件void Function1();/ 全局函數(shù)聲明#endif源文件結(jié)構(gòu)源文件版權(quán)和版本聲明、頭文件的引用和程序的實(shí)現(xiàn)體/ 版權(quán)和版本聲明#include “graphics.h”/ 全局函數(shù)的實(shí)現(xiàn)體void Function1()簡(jiǎn)單的C程序介紹例1:最簡(jiǎn)單的程序#include /包含頭文件 int main(void)/*主函數(shù)*/printf(“this is a c program!n”); /*輸出了一句話*/例2 求兩個(gè)數(shù)之和#include /包含頭文件 int main(void)/*主函數(shù)*/ int a,b,sum;/*定義變量*/a=100;b=200

5、; /*給變量賦值*/sum=a+b/*求a與b的和*/printf(“sum=%dn”,sum);/*輸出結(jié)果*/ scanf(“%d%d”,&a,&b);例3 求兩個(gè)數(shù)中的最大數(shù)#include /包含頭文件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ù)*/i

6、nt a,b,c; /*定義變量*/ scanf(“%d%d”,&a,&b); /*輸入變量a,b的值*/ c=max(a,b); /*調(diào)用函數(shù),將得到的值賦給c*/ printf(“max=%dn”,c); /*輸出c的值*/C程序的結(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)的所有基本字符的組合稱為C語(yǔ)言的字符集。字符集分類(lèi)(1) 大小寫(xiě)英文字母(52個(gè))(2) 數(shù)字符號(hào)(10個(gè))(3

7、) 鍵盤(pán)符號(hào)(33個(gè))(4) 轉(zhuǎn)義字符C語(yǔ)言的基本元素1、符號(hào)集(字符集)C語(yǔ)言使用的基本符號(hào)共有如下5種:(1)大寫(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í)符是用戶自定義的一種字符序列,通常用來(lái)表示程序中需要辨認(rèn)的對(duì)象名稱。標(biāo)識(shí)符的命名規(guī)則標(biāo)識(shí)符是由字符或下劃線開(kāi)頭的字母、數(shù)字、下劃線組成的一串符號(hào);保留字不能作為標(biāo)識(shí)符?!癬”可以作為標(biāo)識(shí)符的第一個(gè)字母,但是往往用于庫(kù)代碼正確標(biāo)識(shí)符:sum i a2 a_2 _a2 _a_2錯(cuò)誤的標(biāo)識(shí)符:2a a? c.g a-2 if whileC語(yǔ)言的數(shù)據(jù)類(lèi)型數(shù)據(jù)是操作的對(duì)象

8、,數(shù)據(jù)類(lèi)型是指數(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)型退出關(guān)鍵字意義char聲明字符型變量或函數(shù)數(shù)double聲明雙精度變量或函數(shù)據(jù)enum聲明枚舉類(lèi)型類(lèi)float聲明浮點(diǎn)型變量或函數(shù)型int聲明整型變量或函數(shù)long聲明長(zhǎng)整型變量或函數(shù)short聲明短整型變量或函數(shù)signed聲明有符號(hào)類(lèi)型變量或函數(shù)struct聲明結(jié)構(gòu)體變量或函數(shù)union聲明共用體(聯(lián)合)數(shù)據(jù)類(lèi)型unsigned聲明無(wú)符號(hào)類(lèi)型變量或函數(shù)void聲明函數(shù)無(wú)返回值

9、或無(wú)參數(shù),聲明空類(lèi)型指針C語(yǔ)言的數(shù)據(jù)類(lèi)型常量什么是常量又稱為字面量,表述常數(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)存中占據(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)型數(shù)據(jù)類(lèi)型類(lèi)型符號(hào)占用字節(jié)數(shù)數(shù)據(jù)類(lèi)型類(lèi)型

10、符號(hào)占用字節(jié)數(shù)整型int4無(wú)符號(hào)長(zhǎng)整型unsigned long4短整型short2單精度實(shí)型float4長(zhǎng)整型long4雙精度實(shí)型double8無(wú)符號(hào)整型unsigned int4字符型char1無(wú)符號(hào)短整型unsigned short2變量存儲(chǔ)類(lèi)型存儲(chǔ)類(lèi)型存儲(chǔ)類(lèi)型符存儲(chǔ)地點(diǎn)自動(dòng)型auto內(nèi)存堆棧區(qū)寄存器型registerCPU的通用寄存器靜態(tài)型static內(nèi)存數(shù)據(jù)區(qū)外部參照型extern變量的定義和初始化變量的初始化變量在定義時(shí)就要初始化變量賦初值的語(yǔ)句格式存儲(chǔ)類(lèi)型符 數(shù)據(jù)類(lèi)型符 變量名=初值;結(jié)構(gòu)型的定義定義語(yǔ)句struct 結(jié)構(gòu)名稱 數(shù)據(jù)類(lèi)型1 成員1名; 數(shù)據(jù)類(lèi)型2 成員2名; .

11、. 數(shù)據(jù)類(lèi)型n 成員n名;結(jié)構(gòu)的本質(zhì)是不同類(lèi)型元素的集合結(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)型變量名.成員名結(jié)構(gòu)型變量地址的引用方法引用格式:&結(jié)構(gòu)型變量名指向結(jié)構(gòu)型數(shù)據(jù)的指針變量的定義和引用指向結(jié)構(gòu)型變量的指針定義方法:同結(jié)構(gòu)型變量的定義方法,區(qū)別在于定義時(shí)變量名前面加*。引用方法方法1: (指針變量).成員

12、名方法2: 指針變量成員名基礎(chǔ)練習(xí):輸入3個(gè)學(xué)生信息,并輸出!(使用兩種引用方式,結(jié)構(gòu)體變量和結(jié)構(gòu)體指針)學(xué)生結(jié)構(gòu)體定義如下:struct student int id; char name20; int age;編程練習(xí)學(xué)生管理系統(tǒng):學(xué)生管理系統(tǒng)可以實(shí)現(xiàn)學(xué)生信息的錄入,查詢,注銷(xiāo)等功能。定義學(xué)生的結(jié)構(gòu)體(以后可以按照具體情況增加個(gè)人信息內(nèi)容)struct student int id; char name20; int age;C語(yǔ)言中的運(yùn)算符運(yùn)算符什么是運(yùn)算符用來(lái)表示各種運(yùn)算的符號(hào)稱為運(yùn)算符。運(yùn)算符特點(diǎn)運(yùn)算符必須有運(yùn)算對(duì)象,運(yùn)算對(duì)象都有規(guī)定的數(shù)據(jù)類(lèi)型,同時(shí)運(yùn)算結(jié)果也有確定的數(shù)據(jù)類(lèi)型。每個(gè)運(yùn)

13、算符都有自己特定的運(yùn)算規(guī)則。當(dāng)表達(dá)式中出現(xiàn)多個(gè)運(yùn)算符時(shí)則必須考慮運(yùn)算符的優(yōu)先級(jí)。同級(jí)別的運(yùn)算符還規(guī)定了結(jié)合性。算術(shù)運(yùn)算符運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性+、-取正、取負(fù)2自右向左*、/、%乘、除、取余數(shù)3自左向右+、-加、減4自左向右增1、減1運(yùn)算符有哪些運(yùn)算符號(hào)j = i+; 相當(dāng)于 j = I; i= i+1;j = +i; 相當(dāng)于 i = i +1; j = i; 運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性+增12自右向左- -減1關(guān)系運(yùn)算符運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性=、 、= 、大于等于、大于、小于等于、小于6自左向右=、!=等于、不等于7自左向右關(guān)系運(yùn)算符要點(diǎn)關(guān)系運(yùn)算符可以用來(lái)比較兩個(gè)數(shù)值型數(shù)據(jù)的大小,也可以比較兩個(gè)

14、字符型數(shù)據(jù)的大小。關(guān)系運(yùn)算符的運(yùn)算結(jié)果是邏輯值,若為“真”用整數(shù)1表示,若為“假”用整數(shù)0表示。邏輯運(yùn)算符運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性!邏輯非2自右向左&邏輯與11自左向右|邏輯或12自左向右邏輯運(yùn)算符的特點(diǎn)邏輯運(yùn)算符運(yùn)算對(duì)象是數(shù)值型或字符型等;如果是非0表示邏輯真,0表示邏輯假。運(yùn)算結(jié)果是邏輯值,如運(yùn)算結(jié)果為真用1表示,若為假則用0表示。邏輯運(yùn)算用“&”對(duì)兩個(gè)表達(dá)式進(jìn)行計(jì)算時(shí),若第1個(gè)表達(dá)式的值為“假”,則與第2個(gè)表達(dá)式的值無(wú)關(guān),結(jié)果肯定為“假”,所以C語(yǔ)言規(guī)定此時(shí)第2個(gè)表達(dá)式不再計(jì)算用“| ”對(duì)兩個(gè)表達(dá)式進(jìn)行計(jì)算時(shí),若第1個(gè)表達(dá)式的值為“真”,則與第2個(gè)表達(dá)式的值無(wú)關(guān),結(jié)果肯定為“真”,所以C語(yǔ)

15、言規(guī)定此時(shí)第2個(gè)表達(dá)式不再計(jì)算賦值運(yùn)算符和賦值表達(dá)式一、賦值運(yùn)算符“=”用法:變量=表達(dá)式作用:將表達(dá)式的值賦給變量如:a=5;ave=(a+b)/10;二、賦值結(jié)果和類(lèi)型轉(zhuǎn)換1、實(shí)型數(shù)據(jù)(包括單、雙精度)賦給整型變量時(shí),舍棄實(shí)數(shù)的小數(shù)部分。2、整型數(shù)據(jù)賦給單、雙精度變量時(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=1f=45.000000逗號(hào)運(yùn)算符和逗號(hào)表達(dá)式形式:表達(dá)式1,表達(dá)式2,表達(dá)式n作用:用于連接表達(dá)式 如:3+5,

16、6-5計(jì)算過(guò)程:1、求解表達(dá)式12、再求解表達(dá)式2,表達(dá)式n3、整個(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注意:并不是任何地方出現(xiàn)的 逗號(hào)都是逗號(hào)運(yùn)算符 如:printf(“%d,%dn”,a,b)條件運(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)算是一種對(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)算的

17、對(duì)象只能是整型數(shù)據(jù)(包括字符型),運(yùn)算結(jié)果仍是整型數(shù)據(jù)位運(yùn)算符分為位邏輯運(yùn)算符、位移位運(yùn)算符、位自反賦值運(yùn)算符三種位運(yùn)算符運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性位非2自右向左&位與8自左向右異或9自左向右|位或10自左向右位移位運(yùn)算符運(yùn)算符名稱優(yōu)先級(jí)結(jié)合性右移自左向右位運(yùn)算符按位與 & 0&0=0; 0&1=0; 1&0=0; 1&1=1 按位或 | 0|0=0; 0|1=1; 1|0=1; 1|1=1 按位異或 00=0; 01=1; 10=1; 11=0按位取反 0=1; 1=0;表達(dá)式什么是表達(dá)式用運(yùn)算符將運(yùn)算對(duì)象連接形成的式子就是表達(dá)式。表達(dá)式的特點(diǎn)每個(gè)表達(dá)式都可以按照其中運(yùn)算符的優(yōu)先級(jí)和運(yùn)算規(guī)則依次

18、對(duì)運(yùn)算對(duì)象進(jìn)行運(yùn)算,最終獲得一個(gè)數(shù)據(jù),該數(shù)據(jù)稱為表達(dá)式的值。表達(dá)式值的數(shù)據(jù)類(lèi)型就稱為表達(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á)式計(jì)算中數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換原則特點(diǎn):參加運(yùn)算的各個(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ù)間的混合

19、運(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ī)則如下:floatdoublelongunsignedintchar,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ì)退出關(guān)鍵字意義for循環(huán)語(yǔ)句控do循環(huán)語(yǔ)句的循環(huán)體制while循環(huán)語(yǔ)句的循環(huán)條件語(yǔ)break跳出當(dāng)前循環(huán)句 continue結(jié)束當(dāng)前循環(huán),開(kāi)始下一輪循環(huán)if條件語(yǔ)句else條件語(yǔ)句否定

20、分支(與if連用)goto無(wú)條件跳轉(zhuǎn)語(yǔ)句switch開(kāi)關(guān)語(yǔ)句case開(kāi)關(guān)語(yǔ)句分支default開(kāi)關(guān)語(yǔ)句中的其它分支return返回語(yǔ)句在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ǔ)句條件執(zhí)行一般形式為:If(表達(dá)式)語(yǔ)句含義:如果表達(dá)式的值為真,則執(zhí)行其后的語(yǔ)句;否則不執(zhí)行該語(yǔ)句。語(yǔ)句表達(dá)式真(非0)假(0)If(x0)printf(“hello!”);例:輸入兩個(gè)數(shù),輸出其中較大的數(shù)main()int a,b,max;printf(“n input two n

21、umbers:”);scanf(“%d%d”,&a,&b);max=a;if(maxb)max=a;min=b;elsemax=b;min=a;if(maxc)min=c;printf(“max=%dt min=%dn”,max,min);else-if語(yǔ)句前面兩種形式的if語(yǔ)句一般都用于兩個(gè)分支情況。在實(shí)際程序設(shè)計(jì)時(shí)經(jīng)常需要進(jìn)行多分支處理,C語(yǔ)言中進(jìn)行多分支處理時(shí),可采用else-if語(yǔ)句實(shí)現(xiàn)。階梯式的if語(yǔ)句一般形式 if(表達(dá)式1)語(yǔ)句1; elseif(表達(dá)式2)語(yǔ)句2; elseif(表達(dá)式3)語(yǔ)句3; elseif(表達(dá)式m)語(yǔ)句m; else語(yǔ)句m+1;含義:依次判斷各個(gè)表達(dá)式的

22、值,當(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)的信息#include main()char c;printf(input a character:);c=getchar(); if(c=0&c=a&c=A&cb)printf(“ABn”);elseprintf(“Ab)max=a; elsemax=b;可以采用條件運(yùn)算符實(shí)現(xiàn): max=(ab)?a:b;條件運(yùn)算符是一個(gè)3目運(yùn)算符,即有3個(gè)參與

23、運(yùn)算的量。由條件運(yùn)算符組成的表達(dá)式稱為條件表達(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é)合方向是自右至左。如:ab?a:cd?c:d例:比較兩個(gè)數(shù)的大小并輸出較大值 main( ) int a,b;printf(“n input two numbers:”);scanf(“%d%d”,&a,&b);printf(“max=%d”,ab?a:b); switch-case語(yǔ)句在實(shí)際中經(jīng)常需要處理多分支問(wèn)題,如統(tǒng)計(jì)學(xué)生成績(jī)分布

24、等,雖然可以用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常量表達(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)型一致(整型與字符

25、型通用)常量表達(dá)式中的數(shù)據(jù)僅起語(yǔ)句標(biāo)號(hào)作用,不作求值判斷常量表達(dá)式的值必須是唯一的,沒(méi)有先后順序多個(gè)case語(yǔ)句可以共用一組執(zhí)行語(yǔ)句循環(huán)結(jié)構(gòu)程序設(shè)計(jì)內(nèi)容提要:循環(huán)就是在滿足一定條件時(shí)重復(fù)執(zhí)行一段程序概述構(gòu)成循環(huán)的語(yǔ)句while、do-while、for、if-goto循環(huán)結(jié)構(gòu)的比較break語(yǔ)句和continue語(yǔ)句While語(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ǔ)

26、句的一般形式:while (表達(dá)式) 語(yǔ)句;如:k=1;while(k=100)s+=k;k+;循環(huán)控制表達(dá)式循環(huán)控制變量循環(huán)體注意: 若循環(huán)體包含一條以上的語(yǔ)句,應(yīng)以復(fù)合語(yǔ)句形式出現(xiàn) 循環(huán)體,必須給循環(huán)控制變量賦值 循環(huán)體中,必須有改變循環(huán)控制變量值的語(yǔ)句(使循環(huán)趨向結(jié)束的語(yǔ)句) 循環(huán)體可以為空如:while(c=getchar()!=A); 等價(jià):c=getchar(); while(c!=A)c=getchar();編程練習(xí):打印100以內(nèi)所有的奇數(shù)(不包括100)打印100以內(nèi)所有的偶數(shù)(不包括100)打印100以內(nèi)所有3的倍數(shù),并統(tǒng)計(jì)個(gè)數(shù)。輸入一個(gè)數(shù),判斷是幾位數(shù)?(使用循環(huán)實(shí)現(xiàn)?。?/p>

27、do-while循環(huán)do-while語(yǔ)句用來(lái)實(shí)現(xiàn)“直到型”循環(huán),它的一般形式為:do語(yǔ)句While(表達(dá)式);不可以省略切記切記!語(yǔ)句表達(dá)式下一語(yǔ)句假真NS圖注意點(diǎn)與while相同for循環(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表達(dá)式1在進(jìn)入循環(huán)之前求解(循環(huán)變量賦初值)表達(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)于循環(huán)體的一部分可以移到語(yǔ)句后面來(lái)說(shuō)明1、表

28、達(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á)式,只要其值不等于0就執(zhí)行循體如: for(k=1;k-4;k+)s+=k;僅當(dāng)

29、k的值等于4的時(shí)候終止循環(huán)。k-4是數(shù)值表達(dá)式。求100以內(nèi)的奇數(shù)、偶數(shù)之和循環(huán)的嵌套一個(gè)循環(huán)體內(nèi)包含著另一個(gè)完整的循環(huán)結(jié)構(gòu),就稱為循環(huán)嵌套內(nèi)嵌的循環(huán)中又可以嵌套循環(huán),從而構(gòu)成多重循環(huán)。三種循環(huán)可以互相嵌套下面給出幾種合法的嵌套形式:(1)while嵌套while(2)do-while嵌套do-whilewhile()dowhile()dowhile();while();(3)for嵌套for(4)while嵌套do-whilefor(;)while()for(;)dowhile();(5)for嵌套while(6)do-while嵌套forfor(;)dowhile()for; while(

30、);循環(huán)嵌套的說(shuō)明嵌套的循環(huán)控制變量不能相同內(nèi)循環(huán)變化快,快循環(huán)變化慢正確確定循環(huán)體循環(huán)控制變量常與求解的問(wèn)題掛鉤有1、2、3、4個(gè)數(shù)字,能組成多少個(gè)互不相同且無(wú)重復(fù)數(shù)字的三位數(shù)?都是多少?main()int i,j,k;printf(n);for(i=1;i5;i+)*以下為三重循環(huán)*/ for(j=1;j5;j+) for (k=1;k5;k+) if (i!=k&i!=j&j!=k) /*確保i、j、k三位互不相同*/ printf(%d,%d,%dn,i,j,k); 幾種循環(huán)的比較一、關(guān)于循環(huán)的控制循環(huán)控制條件修改循環(huán)條件循環(huán)條件初始化break語(yǔ)句和continue語(yǔ)句一、break

31、語(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ǔ)句goto語(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í)精編 關(guān)鍵詞退出關(guān)鍵字意義存auto

32、聲明自動(dòng)變量,缺省時(shí)一般為“auto”儲(chǔ)extern聲明變量是在其它文件中聲明(也可以看做是引用變量)類(lèi)register聲明寄存器變量型static聲明靜態(tài)變量const聲明只讀變量sizeof計(jì)算對(duì)象所占內(nèi)存空間大小其typedef給數(shù)據(jù)類(lèi)型取別名它volatile說(shuō)明變量在程序執(zhí)行中switch開(kāi)關(guān)語(yǔ)句case開(kāi)關(guān)語(yǔ)句分支default開(kāi)關(guān)語(yǔ)句中的其它分支return返回語(yǔ)句3.1.3 C語(yǔ)言知識(shí)精編 預(yù)處理退出預(yù)處理命令意義#define宏定義#undef撤銷(xiāo)已定義過(guò)的宏名#include使編譯程序?qū)⒘硪辉次募度氲綆в?include的源文件中#if#if 的一般含義是:如果#if 后

33、面的常量表達(dá)式為true,則編譯它與#endif 之間的代碼,否則跳過(guò)這些代碼。#else#endif 標(biāo)識(shí)一個(gè)#if 塊的結(jié)束。#elif#else 在# if 失敗的情況下建立另一選擇。#endif#elif 命令意義與else if 相同,它形成一個(gè)if else-if 階梯狀語(yǔ)句,可進(jìn)行多種編譯選擇。#ifdef#ifndef用#ifdef 與#ifndef 命令分別表示“如果有定義”及“如果無(wú)定義”,是條件編譯的另一種方法#line改變當(dāng)前行數(shù)和文件名稱,它們是在編譯程序中預(yù)先定義的標(biāo)識(shí)符,命令的基本形式為:#line numberfilename#error編譯程序時(shí),#error

34、 就會(huì)生成一個(gè)編譯錯(cuò)誤提示消息,并停止編譯#pragma它允許向編譯程序傳送各種指令,當(dāng)編譯器遇到這條指令時(shí)就在編譯輸出窗口中將消息文本打印出來(lái)?!邦A(yù)處理”是指在對(duì)C語(yǔ)言源程序進(jìn)行編譯之前,要先對(duì)程序中的“宏定義、文件包含、條件編譯”等特殊命令進(jìn)行預(yù)先處理。宏定義:定義一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為“宏定義”,該標(biāo)識(shí)符稱為“宏名”。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的“宏名”的地方都用字符串去代換。宏定義分類(lèi):分為有參數(shù)宏定義和無(wú)參數(shù)宏定義兩種。宏的定義不帶參數(shù)的宏定義宏定義的一般格式為:#define 文本串 /*#define就是宏定義命令*/功能:將宏名的值定義為指定的文本串。在預(yù)處理時(shí)

35、凡出現(xiàn)宏名的地方,都用指定的文本串替換。在預(yù)處理時(shí)將宏名替換成指定的文本串的過(guò)程稱為“宏展開(kāi)”,或稱為“宏替換”?!纠?求圓周長(zhǎng)、面積和相同半徑圓球體積。#define PI 3.14159void main() float r,l,s,v; printf(“input radius:”); scanf(“%f”,&r); 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é)果:input radius:6l= 37.70s=113.10v=508.94注意:(1) 宏名

36、為了與變量名區(qū)別一般用大寫(xiě)字母表示。(2) 宏展開(kāi)時(shí)只用文本串替換宏名,不作正確性檢查。(3) 宏定義行末尾不能加分號(hào)。加分號(hào),宏展時(shí)會(huì)當(dāng)作文 本串字符一同代入。 (4) 宏名的有效范圍是:從定義位置開(kāi)始到本文件結(jié)束(5) 可以用#undef命令終止宏定義的作用域。(6) 在宏定義時(shí),可以引用已定義的宏名?!纠吭诤甓x時(shí)引用已定義的宏名#define R 4.0#define PI 3.14159#define L 2*PI*R#define S PI*R*Rvoid main() printf(“L=%6.2fnS=%6.2fn”,L,S);運(yùn)行結(jié)果如下:L= 25.13S= 50.27【

37、例】分析下列程序#define OK 100void main() printf(OK); printf(n);運(yùn)行結(jié)果為:OK為什么不是100?帶參數(shù)的宏定義帶參數(shù)的宏定義格式如下:#define (參數(shù)表) 文本串功能:定義一個(gè)帶參數(shù)的宏。例如:#define S(x,y) 3*x+2*yarea=S(3,2);宏展開(kāi):用實(shí)參從左到右逐個(gè)字符進(jìn)行替換文本串中的形參字符。如圖8.1所示。執(zhí)行:area=S(3,2) 宏展開(kāi)后變成:area=3*3+2*2; 【例】 求圓的面積。 #define PI 3.14159 #define S(r) PI*r*r void main() float

38、a,area; a=3.6; area=S(a); printf(“area=%6.2fn”,area); 運(yùn)行結(jié)果:area= 40.72說(shuō)明:(1) 宏名與括弧之間不能有空格。(2) 宏調(diào)用時(shí),實(shí)參的個(gè)數(shù)必須與形參的個(gè)數(shù)相同。(3) 帶參數(shù)的宏替換時(shí)不作語(yǔ)法檢查。(4) 宏定義時(shí)最好在參數(shù)兩側(cè)加括號(hào)和整個(gè)字符串外加括號(hào),防止宏替換出錯(cuò)。【例】分析以下程序運(yùn)行結(jié)果#define SQ(y) (y)*(y)void main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=160/SQ(a+1); printf(sq=%dn,sq)

39、;比較下面【例6】和【例7】程序的不同之處?!纠?】#define SQ(y) y*yvoid main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=SQ(a+1); printf(sq=%dn,sq);運(yùn)行結(jié)果為:input a number:3sq=7 /*宏代換后得到:sq=a+1*a+1; */【例7】#define SQ(y) (y)*(y)void main() int a,sq; printf(input a number: ); scanf(%d,&a); sq=SQ(a+1); printf(sq=%dn,sq

40、);運(yùn)行結(jié)果為:input a number:3sq=16/*宏代換后得到:sq=(a+1)*(a+1); */宏調(diào)用和函數(shù)調(diào)用的主要區(qū)別:帶參宏函數(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),即裝入#include命令所處位置上使其成為一個(gè)程序。2 文件包含對(duì)文件包含命令還要說(shuō)明以下幾點(diǎn):1.指定文件名可以用雙引

41、號(hào)或尖括號(hào)括起來(lái)。例如:#includestdio.h#include二者的區(qū)別:用尖括弧時(shí),直接在庫(kù)函數(shù)頭文件目錄中查找包含文件,稱為標(biāo)準(zhǔn)方式;用雙引號(hào)時(shí),在用戶當(dāng)前目錄中尋找包含的文件,若找不到,再按標(biāo)準(zhǔn)方式查找。一般情況下:包含庫(kù)函數(shù)用尖括弧節(jié)省時(shí)間;包含用戶自己編寫(xiě)的文件用雙引號(hào)。2. 一個(gè)#include命令只能指定一個(gè)被包含文件。3. 文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含另一個(gè)文件。功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式: #include “文件名” 或 #include #include “file2.c”file1.cfile2.cfile1

42、.cfile2.cABA處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯 直接按標(biāo)準(zhǔn)目錄搜索“” 先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄可指定路徑文件包含源文件(*.c)頭文件(*.h)宏定義數(shù)據(jù)結(jié)構(gòu)定義函數(shù)說(shuō)明等文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cAfile3.cfile2.c被包含文件內(nèi)容/* powers.h */#define sqr(x) (x)*(x)#define cube(x) (x)*(x)*(x)#define quad(x

43、) (x)*(x)*(x)*(x)/*a.c*/#include #include “powers.h#define MAX_POWER 10void 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è)包含文件,或稱為頭文件:第1個(gè)為:myin1.h#include#define PI 3.141

44、59第2個(gè)為:myin2.hfloat getlen(float r) return 2*getsr(r)/r; 第3個(gè)為:myin3.hfloat getsr(float r) return PI*r*r; 主函數(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ù)的調(diào)用關(guān)系,頭文件的包含順序應(yīng)該必須是:myin1.h,然后myin3.h,最后是myin2.h。 一般情

45、況下,對(duì)源程序進(jìn)行全部編譯。條件編譯:根據(jù)具體條件和需要只編譯源程序中的某些部分為條件編譯。條件編譯用途:可以用源程序產(chǎn)生不同版本。3 條件編譯1條件編譯的三種形式:形式一:#ifdef 標(biāo)識(shí)符 程序段1#else 程序段2#endif功能:標(biāo)識(shí)符已被 #define命令定義過(guò)則對(duì)程序段1進(jìn)行編譯;否則對(duì)程序段2進(jìn)行編譯。 形式二:#ifndef 標(biāo)識(shí)符 程序段1 #else 程序段2 #endif功能:如果標(biāo)識(shí)符未被#define命令定義過(guò)則對(duì)程序段1進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。形式三:#if 常量表達(dá)式 程序段1#else 程序段2#endif功能是,如常量表達(dá)式的值為真(非0),則

46、對(duì)程序段1 進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。#include #define LETTER 0int main( ) char str = C language; char c; int i; for (i = 0; stri != 0; i+) c = stri;#if LETTER if (c=a& c=A& c=Z) c=c+32;#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)用,以及宏展的

47、處理過(guò)程,掌握文件包含的概念和使用。實(shí)訓(xùn)內(nèi)容:1試分析以下宏替換后的形式,計(jì)算輸出結(jié)果。要求:先計(jì)算運(yùn)行結(jié)果,然后利用程序驗(yàn)證。#include #define 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í)2.寫(xiě)出下面程序的運(yùn)行結(jié)果(2) #define M 3 #define N M+1 #define NN N*N/2 int main( ) printf(“%dn”, NN) prin

48、tf(“%dn”, 5*NN) ; (1) #define min(x, y) x str_cpy(char *src, char *des)數(shù)組作為函數(shù)返回值,必須通過(guò)指針實(shí)現(xiàn)char *str_cpy(char *src, char *des) 數(shù)組與指針2、指針數(shù)組:即數(shù)組的元素為指針類(lèi)型。 char* var10; /10個(gè)int型指針的數(shù)組 sizeof(var) = ? var + 1 ?3、數(shù)組指針:即指針的類(lèi)型為數(shù)組(指向數(shù)組的指針)。 char (*var)10; /指向10個(gè)int型數(shù)組的指針 sizeof(var) = ? var + 1 ?4、字符串與指針字符串是屬于典

49、型的字符數(shù)組,因而通常通過(guò)char型指針處理字符串 數(shù)組與指針將字符串直接賦值給指針,表示指針指向字符串內(nèi)存首地址注意:字符串常量?jī)?nèi)存分配在只讀數(shù)據(jù)區(qū)(RODATA)實(shí)例:char *p = “xnf”; char arr = “xnf”;*p ? *p+ ? *+p ? *p = X ? arr0 = X ? strcpy(p, “XNF”) ? strcpy(arr, “XNF”) ? 數(shù)組與指針通過(guò)指針數(shù)組表示字符串?dāng)?shù)組char a16 = “welcome”, “to”, “xnf”; 主函數(shù)參數(shù)就是通過(guò)指針數(shù)組實(shí)現(xiàn)的: int main (int argc, char *argv)

50、結(jié)構(gòu)與指針1、結(jié)構(gòu)包含指針:結(jié)構(gòu)體中包含指針域變量 如:學(xué)生信息中name與phone定義為指針 注意:在程序中動(dòng)態(tài)修改學(xué)生信息表中的 name和phone域可行么? 結(jié)構(gòu)與指針2、指向結(jié)構(gòu)體的指針 結(jié)構(gòu)體變量域通過(guò).訪問(wèn),而結(jié)構(gòu)體指針域通過(guò)-訪問(wèn) sizeof(info) = ? sizeof(p) = ? 下面這段代碼錯(cuò)在哪里? 結(jié)構(gòu)與指針 通過(guò)結(jié)構(gòu)體指針傳遞參數(shù)比直接傳遞結(jié)構(gòu)體變量更高效 實(shí)參傳遞給形參時(shí)只拷貝了4個(gè)字節(jié) 指針與指針1、指向指針變量的指針 int i = 100; int *p = &i; int *pp = &p; 實(shí)現(xiàn)指針二級(jí)訪問(wèn): 函數(shù)與指針1、指針作為函數(shù)的參數(shù)向

51、函數(shù)傳遞數(shù)組、字符串、結(jié)構(gòu): 如strc_py、show_info作為函數(shù)的輸出參數(shù)例如:實(shí)現(xiàn)交換兩個(gè)整數(shù)的函數(shù) void swap(int a, int b) 傳值,形參值改變并不能帶回給實(shí)參 傳址,在函數(shù)內(nèi)改變地址內(nèi)保存的內(nèi)容 函數(shù)與指針問(wèn)題: 要在函數(shù)能改變指針的值,怎么通過(guò)輸出參數(shù)返回?例如:void get_mem(char *pmem, int size)pmem = malloc(size); 動(dòng)態(tài)分配的內(nèi)存能通過(guò)pmem帶回么? 不能!要將實(shí)參指針的地址傳遞給形參(二級(jí)指針)才能實(shí)現(xiàn)! 更直接的方法是通過(guò)函數(shù)返回值實(shí)現(xiàn) 函數(shù)與指針2、指針作為函數(shù)的返回值 返回字符串、動(dòng)態(tài)分配的

52、內(nèi)存等,如 *strcpy, *malloc 注意返回地址的有效性(函數(shù)執(zhí)行完畢后該地址未被回收) 下面兩個(gè)函數(shù)哪個(gè)是合法的?函數(shù)與指針3、指向函數(shù)的指針 函數(shù)存放在TEXT段,同樣具有地址 函數(shù)名就是函數(shù)在TEXT段的入口地址 跟數(shù)組名一樣,函數(shù)名也可以看作是一個(gè)指針常量 所以,函數(shù)名也可以賦值給指針變量,那么該指針變量類(lèi)型呢? 函數(shù)指針類(lèi)型!通過(guò)函數(shù)指針,也可以間接調(diào)用函數(shù)。 函數(shù)與指針函數(shù)指針的應(yīng)用:1、作為函數(shù)參數(shù)實(shí)現(xiàn)回調(diào)函數(shù) 所謂回調(diào)函數(shù)是指通過(guò)調(diào)用其他函數(shù)反 過(guò)來(lái)調(diào)用某個(gè)函數(shù) 模擬面向?qū)ο蟮亩鄳B(tài),在UI組件的大量使 用 函數(shù)與指針 2、作為結(jié)構(gòu)體的動(dòng)作域 模擬面向?qū)ο蟮念?lèi),在Lin

53、ux內(nèi)核中大量使用 作為一個(gè)現(xiàn)實(shí)中的對(duì)象,不但有數(shù)據(jù)屬性,還需要有行為屬性 使用對(duì)象行為 3.2 Cortex-M3微控制器軟件接口標(biāo)準(zhǔn)什么是CMSIS微控制器軟件接口標(biāo)準(zhǔn),即(Cortex Microcontroller Software Interface Standard, CMSIS)為什么推出CMSIS一個(gè)ARM內(nèi)核會(huì)授權(quán)給多個(gè)廠家,生產(chǎn)種類(lèi)繁多的產(chǎn)品開(kāi)發(fā)者增加了軟件開(kāi)發(fā)成本將所有Cortex芯片廠商產(chǎn)品的軟件接口標(biāo)準(zhǔn)化,制定了CMSIS標(biāo)準(zhǔn)。芯片廠商就能夠?qū)⑺麄兊馁Y源專注于產(chǎn)品外設(shè)特性的差異化,從而達(dá)到降低開(kāi)發(fā)成本的目的。3.2 Cortex-M3微控制器軟件接口標(biāo)準(zhǔn)CMSIS軟件

54、架構(gòu)3.2 Cortex-M3微控制器軟件接口標(biāo)準(zhǔn)CMSIS層由三部分構(gòu)成(1) 核內(nèi)外設(shè)訪問(wèn)層(CPAL,Core Peripheral Access Layer):該層由ARM 負(fù)責(zé)實(shí)現(xiàn)。包括對(duì)寄存器名稱、地址的定義,對(duì)核寄存器、NVIC、調(diào)試子系統(tǒng)的訪問(wèn)接口定義以及對(duì)特殊用途寄存器的訪問(wèn)接口(例如:CONTROL,xPSR)定義。(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ì)異常向量表

55、進(jìn)行擴(kuò)展,以處理相應(yīng)外設(shè)的中斷請(qǐng)求。(3) 外設(shè)訪問(wèn)函數(shù)(AFP, Access Functions for Peripherals):該層也由芯片廠商負(fù)責(zé)實(shí)現(xiàn),主要是提供訪問(wèn)片上外設(shè)的訪問(wèn)函數(shù),這一部分是可選的。概述STM32標(biāo)準(zhǔn)外設(shè)庫(kù)之前的版本也稱固件函數(shù)庫(kù)或簡(jiǎn)稱固件庫(kù),是一個(gè)固件函數(shù)包,它由程序、數(shù)據(jù)結(jié)構(gòu)和宏組成,包括了微控制器所有外設(shè)的性能特征。每個(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),函數(shù)和參數(shù)名稱都進(jìn)行了標(biāo)準(zhǔn)化。ST

56、公司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ù)概述STM32標(biāo)準(zhǔn)外設(shè)庫(kù)之前的版本也稱固件函數(shù)庫(kù)或簡(jiǎn)稱固件庫(kù),是一個(gè)固件函數(shù)包,它由程序、數(shù)據(jù)結(jié)構(gòu)和宏組成,包括了微控制器所有外設(shè)的性能特征。每個(gè)外設(shè)驅(qū)動(dòng)都由一組函數(shù)組成,這組函數(shù)覆蓋了該外設(shè)所有功能。每個(gè)器件的開(kāi)發(fā)都由一個(gè)通用API (application programming

57、 interface 應(yīng)用編程界面)驅(qū)動(dòng),API對(duì)該驅(qū)動(dòng)程序的結(jié)構(gòu),函數(shù)和參數(shù)名稱都進(jìn)行了標(biāo)準(zhǔn)化。ST公司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ù)縮寫(xiě)外設(shè)名稱縮寫(xiě)外設(shè)名稱ADC模數(shù)轉(zhuǎn)換器I2SIIS總線接口BKP備份寄存器IWDG獨(dú)立看門(mén)狗CAN控制器局域網(wǎng)NVIC嵌套向量中斷控制器CRCCRC計(jì)算單元PWR電源控制DAC數(shù)模

58、轉(zhuǎn)換器RCC復(fù)位和時(shí)鐘控制DBGMCUMCU調(diào)試模塊RTC實(shí)時(shí)時(shí)鐘DMADMA控制器SDIOSDIO接口EXTI外部中斷/事件控制器SPISPI接口SysTick系統(tǒng)定時(shí)器FSMC靈活的靜態(tài)存儲(chǔ)器控制器FlashFlash存儲(chǔ)器TIM定時(shí)器GPIO通用輸入輸出USART通用同步異步收發(fā)器I2CIIC總線接口WWDG窗口看門(mén)狗STM32F10 x標(biāo)準(zhǔn)外設(shè)庫(kù)標(biāo)準(zhǔn)外設(shè)庫(kù)中包含了眾多的變量定義和功能函數(shù),如果不能了解他們的命名規(guī)范和使用規(guī)律將會(huì)給編程帶來(lái)很大的麻煩命名規(guī)則標(biāo)準(zhǔn)外設(shè)庫(kù)遵從以下命名規(guī)則 PPP表示任一外設(shè)縮寫(xiě),例如:ADC。源程序文件和頭文件命名都以“stm32f10 x_”作為開(kāi)頭,例如

59、:stm32f10 x_conf.h。常量?jī)H被應(yīng)用于一個(gè)文件的,定義于該文件中;被應(yīng)用于多個(gè)文件的,在對(duì)應(yīng)頭文件中定義。所有常量都由英文字母大寫(xiě)書(shū)寫(xiě)。寄存器作為常量處理。他們的命名都由英文字母大寫(xiě)書(shū)寫(xiě)。在大多數(shù)情況下,他們采用與縮寫(xiě)規(guī)范一致。外設(shè)函數(shù)的命名以該外設(shè)的縮寫(xiě)加下劃線為開(kāi)頭。每個(gè)單詞的第一個(gè)字母都由英文字母大寫(xiě)書(shū)寫(xiě),例如:SPI_SendData。在函數(shù)名中,只允許存在一個(gè)下劃線,用以分隔外設(shè)縮寫(xiě)和函數(shù)名的其它部分。STM32F10 x標(biāo)準(zhǔn)外設(shè)庫(kù)命名規(guī)則名為PPP_Init的函數(shù),其功能是根據(jù)PPP_InitTypeDef中指定的參數(shù),初始化外設(shè)PPP,例如TIM_Init.名為PPP_DeInit的函數(shù),其功能為復(fù)位外設(shè)PPP的所有寄

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論