數學中我們常見到函式的概念。但是c語言中的函式是什麼呢? 維基百科中對函式的定義:子程式
c語言中函式的分類:庫函式自定義函式
為什麼會有庫函式?
開發效率高;
穩定性好。
這裡我們簡單的看看:www.cplusplus.com
簡單的總結,c語言常用的庫函式都有:
自定義函式和庫函式一樣,有函式名,返回值型別和函式引數。 但是不一樣的是這些都是我們自己來設計。這給程式設計師乙個很大的發揮空間。
函式的組成:
ret_type fun_name(para1, * )舉乙個栗子:ret_type返回型別
fun_name函式名
para1函式引數
寫乙個函式可以找出兩個整數中的最大值。
#include
intget_max
(int x,
int y)
intmain()
寫乙個函式可以交換兩個整形變數的內容。
#include
void
swap1
(int x,
int y)
void
swap2
(int
*px,
int*py)
intmain()
要想知道原因,我們首先知道以下兩個概念
實際引數(實參):
真實傳給函式的引數,叫實參。實參可以是:常量、變數、表示式、函式等。無論實參是何種型別的變數,在進行函式呼叫時,它們都必須有確定的值,以便把這些值傳送給形參。形式引數(形參):
形式引數是指函式名後括號中的變數,因為形式引數只有在函式被呼叫的過程中才例項化(分配記憶體單元),所以叫形式引數。形式引數當函式呼叫完成之後就自動銷毀了。因此形式引數只在函式中有效。上面swap1和swap2函式中的引數x,y,px,py 都是形式引數。在main函式中傳給swap1的num1,num2和傳給swap2函式的&num1,&num2是實際引數。
這裡我們對函式的實參和形參進行分析:
**對應的記憶體分配如下
這裡可以看到swap1函式在呼叫的時候,x,y擁有自己的空間,同時擁有了和實參一模一樣的內容。所以我們可以簡單的認為:形參例項化之後其實相當於實參的乙份臨時拷貝。
而swap2中指標px,py存放的是num1和num2的位址,解引用時指向的就是num1和num2的內容,因此在執行完交換操作後,num1與num2的內容就被改變了。指標的細節可以參看這篇部落格
c語言初階——指標
傳值呼叫
函式的形參和實參分別占有不同記憶體塊,對形參的修改不會影響實參。傳值呼叫即對應了swap1,由於是傳值呼叫,只是將num1和num2的數值1和2傳遞給了形參x,y,因此函式執行完畢後並不會改變num1和num2的數值。
傳址呼叫
傳址呼叫是把函式外部建立變數的記憶體位址傳遞給函式引數的一種呼叫函式的方式。這種傳參方式可以讓函式和函式外邊的變數建立起正真的聯絡,也就是函式內部可以直接操作函式外部的變數。傳址呼叫即對應了swap2,num1和num2的位址被傳遞給了指標px,py,因此修改指標指向的位址的內容就會改變原來num1和num2所對應的數值。
巢狀呼叫
函式裡面再次呼叫函式就是巢狀呼叫
#include
void
firstfun()
void
secondfun()
}int
main()
結果
鏈式呼叫
把乙個函式的返回值作為另外乙個函式的引數。
#include
#include
intmain()
結果
函式宣告:
告訴編譯器有乙個函式叫什麼,引數是什麼,返回型別是什麼。但是具體是不是存在,無關緊要。
函式的宣告一般出現在函式的使用之前。要滿足先宣告後使用。
函式的宣告一般要放在標頭檔案中的。
函式定義:
函式的定義是指函式的具體實現,交待函式的功能實現。
test.h的內容 放置函式的宣告
#ifndef __test_h__
#define __test_h__
//函式的宣告
intadd
(int x,
int y)
;#endif __test_h__
test.c的內容 放置函式的實現
#include
"test.h"
//函式add的實現
intadd
(int x,
int y)
這種多檔案的書寫形式,可以看這兩個部落格的應用例項
c語言小遊戲1——三子棋
c語言小遊戲2——掃雷
什麼是遞迴?
程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 遞迴做為一種演算法在程式語言中廣泛應用。 乙個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的**量。 遞迴的主要思考方式在於:把大事化小。
遞迴的兩個必要條件
最經典的例題就是求n的階乘
int
factorial
(int n)
C語言初階攻略 二
一入 深似海,從此妹紙是路人.前面為大家做了一些簡單的介紹,這部分會帶來一些語句和關鍵字等.一 選擇語句 主要是根據判斷條件,不同的觸發條件觸發不同的結果.比如 如果下雨,就需要打傘,不下雨也就不需要打傘了.二 迴圈語句 while 條件 for 迴圈語句 do.while迴圈語句 三 函式 函式可...
C語言初階攻略 三
在介紹前引入乙個問題 什麼是語句?在c語言中,由乙個分號 隔開的就是一條語句.比如 printf hehe n return 0 下面開始介紹語句 一 分支語句 選擇結構 這裡主要提到if語句 if 表示式 語句 if 表示式 語句1 else 語句2 多種分支的模式 if 表示式1 語句1 els...
C語言結構體初階
結構體變數的定義和初始化 結構體成員的訪問 結構體傳參 結構是一些值的集合,這些值稱為成員變數。結構的每個成員可以是不同型別的變數。struct tag variable list 例如描述乙個學生 typedef struct stu stu 分號不能丟結構的成員可以是標量 陣列 指標,甚至是其他...