1. 程式人生 > >Linux--C函式

Linux--C函式

1.函式的定義

為了使程式大而不繁,簡單明瞭,程式設計者要根據軟體的總體要求,把相同的功能或相似的操作歸納成模組的形式,並設計成函式,以實現程式設計的結構化。

2.函式定義的一般格式

型別識別符號 函式名([引數表列])
{
[宣告部分]
語句
}
呼叫後續宣告的函式時,必須在呼叫之前先進行宣告
函式的定義與宣告例:

1.先定義,後使用  

#include "stdafx.h" 
void show(char p[])
{
printf("%s",p);
}
int _tmain(int argc, _TCHAR* argv[])
{
	
	char p[]="  ddddd";
	show(p);
	return 0;
}
void show(char p[])
{
printf("%s",p);
}

2.main函式在前,定義在後,須在main函式中呼叫

void show(char p[])
{
printf("%s",p);
}
int _tmain(int argc, _TCHAR* argv[])
{
	
	char p[]="  ddddd";
	show(p);
	return 0;
}
void show(char p[])
{
printf("%s",p);
}
例:定義一個函式,用於求數中的最大數。
#include "stdafx.h"
int max(int n1,int n2)
{
return(n1>n2?n1:n2);


}
 int main()   //在可以省略型別型別識別符號,一般不建議使用。
{
int max(int n1,int n2);
int num1,num2;
printf("input two numbers:\n");
scanf("%d%d",&num1,&num2);
printf("max=%d\n",max(num1,num2));
return 0;
}

3.函式的引數與返回值

3.1函式的返回值

3.1.1函式的值只能通過return語句返回主調函式,當遇到return時,方法執行將終止
3.1.2一個函式最多可以返回一個值,不能返回多個值;不返回函式值的函式,可以明確定義為“空型別”,型別說明符為“void”。
3.1.3返回值的資料型別必須與函式宣告時返回值的資料型別匹配。如果兩者不一致,則以函式型別為準,自動進行型別轉換。
3.1.4如函式值為整型,在函式定義時可以省去型別說明。
3.2函式的引數
形式引數:形參出現在函式定義中,在整個函式體內都可以使用,離開該函式則不能使用。
實際引數:實參出現在主調函式中,進入被調函式後,實參變數也不能使用。
注意:
1)形參和實參的功能是作資料傳送。發生函式呼叫時,主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料傳送。
2)形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只有在函式內部有效。函式呼叫結束返回主調函式後則不能再使用該形參變數。
3)實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使實參獲得確定值。
4)實參和形參在數量上、型別上、順序上應嚴格一致,否則會發生“型別不匹配”的錯誤。
5)函式呼叫中發生的資料傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函式呼叫過程中,形參的值發生改變,而實參中的值不會變化。

4.函式呼叫方式

C語言中函式的呼叫一般形式為:函式名([實際引數列表])
1)函式表示式:函式作為表示式中的一項出現在表示式中,以函式返回值參與表示式的運算。這種方式要求函式是有返回值的。例如:c=add(a+b);
2)函式語句:函式呼叫的一般形式加上分號即構成函式語句。例如: printf("%d",a)
3)函式實參:函式作為另一個函式呼叫的實際引數出現。這種情況是把該函式的返回值作為實 參進行傳送, 因此要求該函式必須是有返回值的 。 例如:d=add(a,add(b,c));

呼叫說明(函式的呼叫時應注意)

1)函式名稱必須與具有該功能的自定義函式名稱完全一致
2)實參在數量、型別、順序上應嚴格和形參一一匹配
3)函式呼叫也是一種表示式,其值是函式的返回值
4)被調函式可以是自定義函式,也可以是系統函式,還可以呼叫自身
5)被調函式中還可以呼叫函式
6)呼叫後續宣告的函式時,必須在呼叫之前先進行宣告


遞迴函式的使用:

l遞迴是一種方法(函式)呼叫自己的程式設計技術,它在定義自身的同時又出現了對自身的引用,有點類似於我們高中學的的數學歸納法。用遞迴的目的在於解決一種常見問題,即子任務不過是開始試圖解決的相同問題的一個較簡單版本注意:l發現邏輯“相似性”

不要忘記遞迴出口


區域性變數:區域性變數也稱為內部變數

1.在函式內作定義說明的2.隨函式的呼叫而生成,隨函式呼叫結束而釋放3.作用域限於定義它的函式,離開該函式後再使用這種變數是非法的

全域性變數:全域性變數也稱為外部變數

1.它是在函式外部定義的變數2.它不屬於哪一個函式,它屬於一個源程式檔案3.其作用域是從定義變數的位置開始到所在源程式檔案結束。4.在函式中使用全域性變數,一般應作全域性變數說明。只有在函式內經過說明的全域性變數才能使用。全域性變數的說明符extern。但在函式之前定義的全域性變數,在該函式內使用可不再加以說明。

變數的儲存類別:

1.從變數值存在的生存期來分,可以分為靜態儲存方式和動態儲存方式。1.1靜態儲存方式:是指在程式執行期間分配固定的儲存空間的方式。1.2動態儲存方式:是在程式執行期間根據需要進行動態的分配儲存空間的方式2.C語言中,具體的儲存類別有自動、暫存器、靜態及外部四種2.1自動儲存型別(auto):具有動態性,隨函式呼叫而生成,隨呼叫結束而釋放;區域性變數預設2.2暫存器儲存型別(register):大量重複呼叫時,提高執行效率;僅限於定義它的函式2.3外部儲存型別(extern):個程式檔案之間進行變數呼叫;不是變數定義,擴充套件變數作用域2.4靜態儲存型別(static):儲存在固定的記憶體單元,直到程式執行結束才釋放

常用系統函式:

終端與環境變數     getopt()分析命令引數ttyname()獲取終端機名稱日期時間函式<time.h>     time()獲取當前時間     ctime()獲取字串格式的日期時間     gmtime()獲取當前日期和時間     difftime()計算時間差字串處理<string.h>index()查詢字串中第一個字元出現的位置strcat()拼接字串strcmp()比較字串strcpy()複製字串數學函式<math.h>abs()絕對值cos()餘弦ceil()不小於引數的最小整數exp()指數sqrt()開平方資料結構與演算法crypt()將資料或密碼加密bsearch()二元搜尋      lfind()線性搜尋lsearch()線性搜尋rand()產生隨機數srand()設定隨機數種子