C語言函式的應用

2021-07-13 07:43:53 字數 4879 閱讀 1343

一. 函式的概念:

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...