c語言中的函式分為庫函式和自定義函式,庫函式顧名思義就是已經封裝好了的現成的函式,我們直接呼叫就可以了,而自定義函式就需要我們自己去寫出來。
ret_type fun_name(para1, *)
ret_type是返回型別
fun_name是函式名
para1是函式引數
這就是乙個函式的基本的形式,其中如果ret_type是void型別的,不需要返回值,而其他型別的則需要有返回值。
下面舉個例子來看看
//交換兩個變數的值
void
swap1
(int x,
int y)
void
swap2
(int
* x,
int* y)
intmain()
從上面的**中我們可以看到,交換變數的值有兩種寫法,那麼是否都是正確的呢?
答案是否定的,我們在主函式中傳遞的變數是實參,而函式中建立的引數是形參(形參是實參的乙份臨時拷貝),實參在記憶體空間開闢了一塊空間後,函式中的形參又另開闢了一塊空間,將實參的值進行了拷貝,所以如果將實參的兩個變數傳到函式中,並不能起到改變實參的作用;
而如果將兩變數的位址傳到函式中的話,函式開闢的指標變數則可以遠端操縱實參的值,從而達到交換的目的,所以顯然swap2可以達到交換的目的,而swap1則不行。
上面的例子就引出了函式呼叫的兩種形式:
傳值呼叫
函式的形參和實參分別占有不同的記憶體塊,修改形參的值對實參不產生影響。
傳址呼叫·傳址呼叫是把函式外部建立變數的記憶體位址傳遞給函式引數的一種呼叫方式;
·這種傳參方式可以將函式與外部建立的變數建立真正的聯絡,從函式的內部就可以直接操縱函式外部的變數。
1、函式的宣告一般在函式使用之前,滿足先宣告後使用
2、函式的宣告一般放在標頭檔案中
在函式中有一種特殊的函式,那就是遞迴函式,那麼什麼是遞迴?
遞迴程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴的主要思考方式在
於:把大事化小
遞迴的兩個必要條件
1、存在限制條件,當滿足這個限制條件後,遞迴將不再進行;
2、每次遞迴都會逼近這個限制條件。
下面舉個例子
//求字串長度
intmystrlen
(const
char
* str)
上面的例子中,我們可以看出,限制條件就是當「 *str == 『\0』」的時候,每次else遞迴後,指標都會往後面挪動一位,逐漸逼近『\0』,最終完成呼叫返回字串長度。
可以說掌握了遞迴這種程式設計技巧,那麼無論是從**量或是從邏輯實現的複雜度上,都會大大的降低難度,但是遞迴不是萬能的,有的情況下遞迴很方便,但是有的情況下迭代缺更好,比如下面這個例子
//求第n個斐波那契數
//遞迴
intfib1
(int n)
//迭代
intfib2
(int n)
else
return fib2;
}
上面的**是求第n個斐波那契數的遞迴和迭代的兩種寫法,其中遞迴的時間複雜度是o(2^n),隨著n的增加,時間複雜度呈指數增長,而迭代的時間複雜度卻只有o(n),僅僅是線性增長,所以我們在使用遞迴的時候,需要多方面考慮。 C語言 函式
1 實參和形參在數量上,型別上,順序上應嚴格一致,否則會發生 型別不匹配 錯誤。2 實參可以是常量,變數,表示式甚至是函式。但是在傳遞給函式前,必須有確定的值。3 形參變數只有在被呼叫時才分配記憶體單元,只有在函式內部有效,函式結束後不能再使用。4 實參和形參佔據不同的儲存單元。5 函式預設採用值傳...
c語言 函式
函式是實現某個功能的 段 函式之間的關係是並列的,不能巢狀 函式的定義 函式的返回值型別 函式名 引數的型別 引數名1.正常的函式有三部分 1.函式的宣告 2.函式的定義 3.函式的呼叫 如果函式在定義之前被呼叫的話,需要對函式提前進行宣告,當然在定義之後在呼叫如果沒有宣告也不會提示錯誤 函式的返回...
C語言函式
和變數 控制流 條件一樣 函式也是現代程式語言的基本組成部分。他可以使我們在應用中重複利用一塊 對於 的組織和維護是很有必要的。您將在ios和os x的框架中發現大量的例子。像其他的基礎元素一樣,object c的函式也是建立在c語言函式之上的。這章我們將介紹c語言最重要的方面,包括基本語法 宣告和...