當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > 嵌入式學(xué)習(xí)筆記:函數(shù)入門知識總結(jié)
函數(shù)的意義
函數(shù)是一段程序,可以完成一個功能,例如:printf
提高程序的通用性,減少重復(fù)的代碼(具有相似功能的代碼)
實現(xiàn)模塊化設(shè)計的基礎(chǔ)
1.2函數(shù)的分類
main()函數(shù),每個程序都必須要實現(xiàn)的,程序從main()函數(shù)開始執(zhí)行,從main()函數(shù)結(jié)束
庫函數(shù):由系統(tǒng)已經(jīng)實現(xiàn)的函數(shù),例如:printf
自定義函數(shù):用戶自行設(shè)計并實現(xiàn)
1.3函數(shù)的使用
以math(數(shù)學(xué)庫)為例,用man math.h查看庫中函數(shù)
注意:必須有頭文件:#include
例子1:pow()
函數(shù)功能:計算x的y次方,可使用man pow可查看pow()函數(shù)的使用方法
函數(shù)模型:double pow(double x,double y)
提供的信息:需要的參數(shù),返回的結(jié)果的類型
使用函數(shù)的語法:函數(shù)名(參數(shù)列表)
實際情況
例子2:sqrt()
函數(shù)的功能:計算一個數(shù)的平方根
函數(shù)原型:double sqrt() //
提供的信息:需要提供一個double類型的參數(shù)
使用函數(shù)提供的參數(shù)可以是常量,變量,表達(dá)式
注意:使用數(shù)學(xué)庫在編譯時候必須使用 gcc select.c –lm
pow,sqrt為double型
補充:常見數(shù)學(xué)函數(shù)
1.4函數(shù)的執(zhí)行過程
一旦程序中包含其他函數(shù)的調(diào)用(使用),執(zhí)行到對應(yīng)的函數(shù)調(diào)用的語句時,跳轉(zhuǎn)到對應(yīng)的函數(shù)執(zhí)行,執(zhí)行完畢后會返回調(diào)用的語句的下一條語句繼續(xù)執(zhí)行
具體實現(xiàn)過程:
1.5函數(shù)的定義
1.51函數(shù)的定義:函數(shù)的實現(xiàn),需要我們設(shè)計函數(shù)對應(yīng)的功能,參數(shù),以及返回值
1.52定義的語法:
類型標(biāo)識符 函數(shù)名(形式參數(shù)類型說明列表)
{
函數(shù)體
}
注:類型標(biāo)識符:說明函數(shù)返回值的類型
函數(shù)名:符合命令規(guī)則即可,函數(shù)入口地址
形式參數(shù)說明列表:函數(shù)執(zhí)行時需要提供的參數(shù)
函數(shù)體:具體的功能實現(xiàn)
():函數(shù)的標(biāo)識
1.53設(shè)計過程:
(1)函數(shù)的原型設(shè)計:函數(shù)的名字,參數(shù),返回值的類型確定
注意:需要將函數(shù)的原型設(shè)計寫在調(diào)用(使用)之前,為了編譯器對函數(shù)調(diào)用語句進行語法檢查,
例如:int max(int x, int y);
注意:函數(shù)的聲明處需要加分號
(2)函數(shù)的函數(shù)體的設(shè)計:函數(shù)的名字,參數(shù),返回值類型的確定
函數(shù)具體功能的實現(xiàn)
注意:一個函數(shù)中,不能嵌套定義另外一個函數(shù),
完整實例:
1.6函數(shù)的形式參數(shù)
表示函數(shù)所需要的參數(shù)
形式參數(shù)寫在函數(shù)定義與聲明中形式列表中
類型標(biāo)識符 函數(shù)名(類型1 參數(shù)名1,類型2 參數(shù)名2…..)
每個形式參數(shù)都必須寫參數(shù)名與類型
正確寫法:int add(int x,int y)
錯誤寫法:int add(int x,y)
形式參數(shù)一般每變量名
1.7函數(shù)的實際參數(shù)
表示函數(shù)提供的參數(shù)
實際參數(shù)是在函數(shù)調(diào)用時寫在括號中的實際參數(shù)列表
函數(shù)名(實際參數(shù)1,實際參數(shù)2…..)
例如:add(3,4,5)
1.8值傳遞
將實際參數(shù)的值傳遞給形式參數(shù)
在傳遞值采用一一對應(yīng)的方式
如:形參1=實參1 形參2=實參2….
只能將實際參數(shù)的值傳遞給形式參數(shù),且只能單向傳遞
實際參數(shù)與形式參數(shù)之間,保持類型、個數(shù)、順序一致
1.9無參函數(shù)
沒有形式參數(shù)的函數(shù),在形式參數(shù)類表中使用void表示(標(biāo)準(zhǔn)規(guī)范)
注意:調(diào)用時候,括號中不需要寫void
實例:
1.10函數(shù)的返回值
如果一個函數(shù)需要返回運算結(jié)果,使用return關(guān)鍵字
return可以為變量或表達(dá)式或常量
函數(shù)允許沒有return,正對沒有返回值的函數(shù),不能return一個值,函數(shù)執(zhí)行完畢后,自動返回
例如:
注意:return的值原則上需要與聲明的返回值的類型保持一致
如果沒有返回值,就寫void
補充:return的作用:1.返回一個值
終止函數(shù)的執(zhí)行,立即返回
1.11注意及補充
1.變量的作用域:表示一個變量的作用范圍
變量的生命周期:表示一個變量在內(nèi)存中存在的時間
局部變量:一般定義在函數(shù)的內(nèi)部(包括形式參數(shù))
作用域:一般從定義的位置開始,到對應(yīng)的{}結(jié)束
生命周期:從定義的位置開始,到超過作用域之后結(jié)束
從分配空間(定義時)到釋放空間(超過作用域)的時間
全局變量:定義在函數(shù)外部
作用域:從定義的位置開始,到整個源文件結(jié)束
生命周期:從定義的位置開始,到整個程序執(zhí)行結(jié)束
補充:程序加載到內(nèi)存中之后,將數(shù)據(jù)分不同的類型分開存儲,不同的區(qū)域存儲不同的類型
棧區(qū):存儲局部變量
數(shù)據(jù)區(qū):存儲靜態(tài)變量(使用static int a)
作用:以提高局部變量的生命周期(從定義的位置開始,一直到函數(shù)執(zhí)行結(jié)束)但是沒有改變作用域,且只會初始化一次,對應(yīng)的值一直存在
注意:函數(shù)的形式參數(shù)屬于局部變量,不同函數(shù)的形式參數(shù)即使同名,在內(nèi)存空間中是不同的
不同函數(shù)中使用相同名字的局部變量,在內(nèi)存中同樣擁有不同的存儲空間
形式參數(shù)不會影響實際參數(shù)
局部變量,靜態(tài)變量,全局變量都是根據(jù)作用域,生命周期來進行區(qū)分
自動變量(auto),靜態(tài)變量(static)根據(jù)存儲區(qū)域來進行區(qū)分
默認(rèn)情況變量的存儲類型為auto,屬于自動局部變量,超過作用域,生命周期就結(jié)束
√符號常量:在c語言中使用#define關(guān)鍵字來定義,提高程序的通用性
使用:#define 符號標(biāo)識名 常量值(表達(dá)式)
#define SIZE 5
原理:在預(yù)編譯階段進行符號標(biāo)識的替換,將程序所有引用的符號表示替換成后面的值
流程:源程序(test.c)--預(yù)編譯(處理預(yù)處理命令,以#開頭)---編譯(c—cpu指令)---匯編---鏈接(test.0,ptintf.o)--可執(zhí)行文件
2. goto 語句:跳轉(zhuǎn)到指定的標(biāo)識符去執(zhí)行
例子:
3.技巧性:在ubuntu中ctrl+v進行選中后,按=可對齊所選行列
4.應(yīng)用性:計算二維數(shù)組的行列和時,可使用以下方法
5. bool 類型:在c語言中用于表示真和假的類型,在內(nèi)存中的值為 1 和 0
使用 true(1) 與 false(0)表示
使用方法:
① 定義頭文件:#include
② 使用函數(shù):
6技巧性:用于顯示重復(fù)的數(shù)字,字母等時,要靈活使用數(shù)組下標(biāo)
具體案例: