一. 函式的概念:
1. 將一些大的或者是功能相同的程式分割成乙個個程式塊, 在使用的時候可以直接呼叫, 這種程式塊就稱為函式.
2. 函式的作用:
①. 函書是構成程式的基本單元.
②. 函式的使用可以省去重複**的編寫.
③. 函式使得程式更加模組化, 從而有利於程式的閱讀.修改和完善.
3. 函式的分類:
(1). 按函式定義的角度分為:
①. 庫函式: 由c++系統提供, 使用者無須定義, 只需在程式前包含有該函式原形的標頭檔案即可在程式中呼叫.
②. 使用者自定義函式: 由使用者按需要寫的函式.
(2). 按函式的返回結果角度分:
①. 有返回值函式.
②. 無返回值函式.
(3). 按函式間資料通訊方式分:
①. 無參函式: 函式定義. 函式說明及函式呼叫中均不帶引數.
②. 有參函式: 在函式定義及函式說明時都有引數(形參), 在函式呼叫時也給出引數(實參).
※ main()函式是主函式, 它可以呼叫其他函式, 而不允許被其他函式呼叫.
(4). 函式的一些約定:
①. 函式不能巢狀定義, 要另外寫.
②. 允許巢狀呼叫(在乙個函式中呼叫另乙個函式).
③. 允許遞迴呼叫(在函式中呼叫它自己本身).
④. c++源程式必須有, 也只能有乙個主函式main().
4. 函式的幾種形式:
(1). void f() ; // 函式宣告(原形)
(2). void f()
….; // 函式定義(實現)
(3).f() ; // 函式呼叫
二. 函式的定義:
※ 說明: 返回值型別: 函式返回給呼叫者的資料的型別.
函式名: 是由使用者定義的識別符號, 它的命名規範為:
①. 首字母必須大寫.
②. 要求用大小寫字母組合規範函式命名, 即每個單詞的首字母也大寫.
③. 最好用下劃線進行間隔, 例:
intsum( int _nnum1, int_nnum2 ) // int後有空格.
return(_nnum1 + _nnum2 ) ;
1. 無參函式的定義:
格式:
返回值型別 函式名(void) // void可不填.
語句塊; // 函式體.
2. 有參函式的定義:
格式:返回值型別 函式名(形式引數列表)
語句塊; // 最後一定要有return(..)作為結尾.
三. 函式的引數:
函式的引數分為形參(形式引數)和實參(實際引數)兩種.
1. 形參出現在函式定義中,並在整個函式體內都有效, 當該函式結束後不能使用.
2. 實參出現在主調函式中, 進入被調函式後, 實參變數不能使用.
3. 形參和實參具有以下特點:
(1). 實參和形參在數量上, 型別上, 順序上應嚴格一致, 否則會發生」型別不匹配」的錯誤.
(2). 形參變數只有在被呼叫時才分配記憶體單元, 只有在函式內部有效, 函式結束後不能再使用.
(3). 實參和形參佔據不同的儲存單元.
(4). 函式預設採用值傳遞, 即實參的值單向傳遞給形參, 實參的值並不改變(無論形參怎麼改).
(5). 實參可以是常量.變數.表示式甚至是函式, 但是在傳遞給函式前, 必須有確定的值.
※ 理解形參只在函式內部有效:
void swap( int_a, int _b )
int temp = _a ;
_a = _b ;
_b= temp ;
intmain( argc, char*argv ) // 此運算得出來的結果為」x: 10 y:20」
// 如果沒有下面的else, 就會報警告, 因為函式沒有return作為結束.
else
return _b ;
語句塊可以優化成:
if( _a > _b )
return _a ;
return _b ;
最簡單的方法是用三目運算的條件表示式: ( a>b ? a:b )
3. 函式返回值型別和函式定義時的返回值型別應保持一致, 如果不一致, 則以函式定義時為準, 自動進行型別轉換, 例:
int sum( int_value )
return _value*10.5; // 返回結果為10; 丟失精度.
4. 無返回值的函式, 返回值可以明確定義為」空型別」, 但是不能不寫返回值型別, 型別為」void」. 返回值可以不寫, 也可以寫」return ;」
5. 當在函式中使用return語句返回後, 其後面的語句將不會被執行.
五. 函式的宣告及呼叫.
1. 宣告格式: 返回值型別 函式名(形式引數列表)
或者是返回值型別 函式名(形參型別, 形參型別,…)
例如: void f() ;
(1). 函式可以被多次宣告, 但只能定義一次.
注: 函式宣告裡有這種情況:
intmax( int _a, int_b ) ;
可以寫成
int max( int, int ) ;
注: 定義的時候一定不能省.
(2).函式的宣告就是函式的原形.
※ 要學會看函式的原形, 從原形裡知道函式的用法.
(3). 當函式寫在main下面的時候, 就要在main函式前面進行宣告, 如果寫在前面, 就不需要宣告(也可以寫).
2. 函式的呼叫格式:函式名(實際列表引數);
例如: f() ;
3. 函式的巢狀呼叫: c語言和c++中不允許巢狀的函式定義, 但允許在乙個函式中呼叫另乙個函式, 叫巢狀呼叫.
函式與變數
一. 程式的記憶體區域:
1. **區: 存放程式的**和和各個函式的**塊.
2. 資料區: 存放程式的全域性變數和靜態變數及常量.(由系統自動管理)
3. 棧區: 存放程式的區域性變數. 用於存放非常小的資料, pc上1m左右, 手機上1k左右. 它存放的資料為:
①. 臨時變數.
②. 函式的形參.
③. 8位元組長度左右的資料.
4. 堆區: 存放動態資料, 需要用指標訪問. 最大支援2g(pc), 手機上為2m.
※ 棧區和堆區的區別:
(1). 堆區的記憶體由自己申請自己釋放, 如果申請了不釋放, 就叫記憶體洩漏;
棧區的記憶體是由系統自動分配的, 沒有記憶體洩漏問題.
(2). 棧區放非常小的資料, 堆區放比較大的資料.
(3). 堆區相比靈活性更高, 而棧區則效率更高.
(4). 棧區不會出現碎片, 堆區會出現.
(5). 就記憶體位置來說, 棧區是順序分配的, 堆區是隨機分配的.
二. 全域性與區域性變數:
1. 全域性變數: 在函式外部定義的變數, 不屬於哪乙個函式, 而是屬於乙個源程式檔案.
2. 區域性變數: 也稱為內部變數, 現預設所有非全域性變數都為區域性變數.
3. 靜態全域性變數:
格式: static
int a = 0 ;
4. 靜態區域性變數: 如果希望在乙個函式結束後保留在其內部的區域性變數的值, 就用」static」進行宣告, 稱為靜態區域性變數.
格式: static
int b = 10 ;
※ 比較幾種變數的區間.生命週期.作用域及初始值:
型別
區間
生命週期
作用域
初始值
全域性變數
資料區main函式執行之前被建立, 在整個程式結束之前被**.
從定義開始到檔案結束的所有函式; 在同乙個專案中其他檔案都可以使用.
0靜態全域性變數
(static
全域性變數
)
資料區同上
從定義開始到檔案結束的所有函式; 其他專案中的檔案不可以使用.
0區域性變數
棧區從程式被呼叫時被建立, 在該程式塊結束前被**.
從定義開始到大括號結束.即只能在**塊中的語句使用.
隨機值靜態區域性變數
(static
區域性變數
)
資料區函式不被呼叫時不建立, 第一次呼叫的時候被建立, 之後再用就不會被建立了(可以忽略不看了, 只被初始化一次). 在整個程式結束前被**.同上0
以上表理解全域性函式, 靜態全域性函式(規則一樣). 注:沒有區域性函式的概念, 因為函式不能巢狀.
三. 雜項:
1. 程式在執行的時候, 先從當前的**塊中尋找, 找不到再到外面找, 找不到再到全域性變數去找, 再到別的檔案去找, 還是找不到就報錯.
2. 如果在乙個程式塊裡要訪問乙個全域性變數, 就在變數前面加雙冒號」::」(區域性變數重名時使用)
例: staticin a = 0 ;
printf( 「%d\n」, ::a ) ;
3. const
int size = 100 ;
寫在函式裡就占用棧區, 寫在函式外就佔資料區(相當於全域性變數)
4. 以下例子為說明區域性變數的作用域的, 輸出結果為」10, 0」.
intmain()
inta = 0 ;
char ch[100]= 」」 ;
while(1)
int a = 10 ;
printf( 「%d\n」, a ) ;
if( 10 == a )
break ;
printf(「%d\n」, a ) ;
return0 ;
應用C語言的 at 函式
平常很少接觸微控制器程式,都是系統的應用程式,windows linux下一些應用程式 c語言本身沒啥問題,本身就跟c 風格接近,linux下很多 也用c來實現 但基本上用不到一些特殊函式,例如 at 函式 先來了解下 at是幹嘛用的 絕對定位,可以把變數或函式絕對定位到flash中,或者定位到ra...
c語言qsort函式的應用
qsort函式 全稱quicksort 它是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分法寫的,其時間複雜度為n log n 功能 對乙個陣列進行排序 任意型別陣列 函式定義 void qsort void base,size t num,size t width,int c...
C語言中qsort函式的應用
qsort函式包含在的標頭檔案裡,本文中排序都是採用的從小到大排序 int num 100 int cmp const void a const void b qsort num,100,sizeof num 0 cmp char word 100 int cmp const void a cons...