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