在一個程序中,若是在不一樣地點屢次執行某項操做,就能夠把完成這項操做的程序段從程序中獨立出來,定義成函數,而原來程序中凡須要進行這個操做的程序段能夠只用「函數調用」來替代,從而達到簡化程序清單的目的。創建函數成爲「函數的定義」,使用函數稱爲「函數的調用」。git
一般把調用其它函數的函數稱爲「主調函數」,而別調用的函數稱爲「被調函數」。在C語言中,任何函數均可以是被調函數,也能夠是主調函數。而主函數只能是主調函數,不能是被調函數,由於任何函數都不能調用主函數。數組
每個函數都能完成特定的任務,稱爲「函數的功能」;每次調用函數時的某些待處理的數據和函數運行後得到的某些結果統稱爲「函數的參數」;把主調函數中加工對象帶入函數,稱爲「函數參數的輸入」;吧函數運行的某些結果帶回主調函數,稱爲「函數參數的輸出」;函數參數的輸入和輸出統稱爲「函數間數據的傳遞」。dom
格式爲:存儲類型符 數據類型符 函數名(形式參數表)函數
數據定義語句序列;spa
執行語句序列;指針
一般把一堆花括號括住的部分稱爲「函數體」,函數體前面的部分稱爲「函數頭」。對象
1)函數頭blog
存儲類型符 能夠是extern或static兩種生命週期
選取extern,則定義的函數叫作外部函數,它能夠被其它編譯單位中的函數調用;選取static的函數叫作內部函數,它只能被本編譯單位中的函數調用。存儲類型說明符能夠省略,省略時,默認爲外部函數。內存
數據類型符 規定返回值的類型,能夠是指針形,數組型,集合型,字符串型,整數型,void型等。
函數名 是一個標識符,在同一個編譯單位中函數是是不能重名的。若是參數不同,函數名是是能夠相同的。
2)函數體
數據定義語句序列 若干條數據定義語句組成,用來定義本函數中使用的變狼、數組、指針變量等。
執行語句序列 本函數中完成函數功能的程序段組成。若是有返回值,則在序列中至少有一條返回語句return
各種函數的定義模式(static或extern或空)
1。有參函數: public static String test(int a)
2。無參函數: public static String test()
3。有返回值函數: public String test(){return "asdf"};
4。無返回值函數:public void test(){};
5。內部函數: public static String test()
6。外部函數: public extern String test()
注意:內部函數與外部函數的主要區別是「存儲類型符」。內部函數的存儲類型是「static」,而外部函數的存儲類型符石「extern」或 空;
3)函數調用的過程
1.首先暫停函數調用所在語句的執行,轉向被調用的函數繼續執行。
2.爲函數的全部形式參數分配內存;再將全部實際參數的值計算出來,依次賦予對應的形式參數(若是形參是數組則不給形參分配內存。)若是是無參函數,則本項操做不執行。
3.進入函數體,先執行數據定義語句,爲函數體中定義的變量、數組等分配內存。
4.在執行函數體中的可執行語句。
若是是「無返回值函數」,則執行到「返回語句」。若返回語句被省略,則執行到函數體的右花括號。
若是有返回值函數,則執行到返回語句時,計算表達式值做爲函數的返回值。
5.收回分配給本函數體中定義的變量、數組、形式參數的內存單元。
6.返回主調函數繼續執行。
1)變量的存儲類型。
存儲類型符及其含義以下。
1.自動型
自動型又稱堆棧型。自動型變量是分配在內存的堆棧區,堆棧區內存在程序運行中是重複使用的。假定某個函數中定義了自動型變量,函數被調用時,C語言就在堆棧區給該變量分配內存用於存放變量的值。當函數調用結束時,C語言就釋放該變量,即從堆棧區中收回分配給該變量的內存,以便從新分配給其餘自動型變量。這樣作的目的是節省內存。
2.寄存器型
寄存器型變量是分配在CPU的通用寄存器中。因爲CPU具備的通用寄存器數量有限,C程序中容許定義的寄存器型變量通常以2個左右爲宜。若是定義爲寄存器型變量的數目超過所能提供的寄存器數目,編譯系統自動將超出的變量設爲自動型變量。對於佔用字節數多的變量,如:long,float,double類型的變量通常不能定義爲寄存器型變量。
3.靜態型。
靜態型變量是分配在內存的數據區中,它們在程序開始運行時就分配了固定的內存,在程序運行過程當中不釋放。只有程序運行結束後,才釋放所佔用的內存。
4外部參照型
外部參照型變量是專用於多個便宜單位之間傳遞數據用的。
變量初始化和變量存儲類型有很大關係,進行初始化時要注意下列幾點:
#外部參照型(extern)變量不容許初始化。自動型(auto)變量、寄存器(register)變量和靜態型(static)變量均可以初始化。
#自動型變量和寄存器變量若是進行初始化,則每次進入所定義的函數或複合語句都隨着從新定義而從新初始化。自動型變量和寄存器型變量若是不進行初始化,變量值將不肯定。所以,必須用其餘賦值方式爲其賦值後方能參與運算。
#景泰興變量若是進行初始化,只有第一次執行定義語句時隨着分配內存賦予初值,當退出所定義的函數或複合語句時,將保留分配給它的內存和其中的值。再次進入定義的函數或複合語句時,不在從新分配內存,也不進行初始化。
2)變量的生命週期
因爲變量必須分配內存單元(或寄存器),因此變量就有存貨時間的問題。通俗的說,當某個變量佔用內存單元(或寄存器)時,咱們就說他「活着」;當變量佔用的內存單元(或寄存器)被收回了,咱們就說他死了。咱們把變量從開始i分配內存單元(或寄存器)到分配的內存單元(或寄存器)被收回的期間稱爲「變量的生存期」。
3)變量的做用域
在變量的生存期中,咱們把變量可使用的程序區域稱爲變量的做用域。任何變量只能在其做用域內使用,不能再其做用域外使用,不然程序就會出錯。例如:局部變量就只能在局部使用。
指針型函數是指該函數的返回值是指針行,也就是說,這類函數的返回值必須是地址值,調用該類函數時,接受返回值的必須是指針變量、指針數組元素等能存放地址值的對象。
例如:char *max_char(int n){char *p; p=a; return(p);}
1)指針型函數的調用
指針型函數的調用和通常函數的調用方法徹底相同,惟一須要注意的是隻能用指針變量或指針型數組元素來接受指針型函數的返回值,不能使用數組名來接受指針型函數的返回值,由於數組名是地址常量,不是地址型變量,不能接受地址型數據。
例如:char *max_char(int n){........}
void main(){
int n=2;
char *p;
p=max_char(n);
}
1)文件包含命令
格式1:#include<文件名> //則系統僅按規定的路徑搜索文件。
格式2:#include "文件名" //系統先在本程序清單文件所在的磁盤和路徑下尋找文件;若找不到,在按系統規定的路徑搜索文件。
經常使用系統函數
1)常數的數學處理函數
1.求整形絕對值函數
函數頭 int abs(int x)
例如:abs(-10) 結果爲10
abs(-32768) 結果爲-32768.
說明:本函數返回值在0-32767.若是x的值爲-32768,則返回值爲-32768
2.求長整形絕對值函數
函數頭 long labs(long x)
例如:labs(-10L) 結果爲10.
3.求實型絕對值函數
函數頭 double fabs(double x)
例如:fabs(-10.2) 結果爲10.2.
4.求小於或等於x的最大整數函數
函數頭 double floor(double x)
例如:floor(-10.5) 結果爲-11.0.
floor(10.0) 結果爲10.0.
5.求大於或等於x的最小整數函數
函數頭 double ceil(double x)
例如:ceil(-10.5) 結果爲-10.0.
ceil(10.9) 結果爲11.0.
6。求正平方根函數
函數頭 double sqrt(double x)
說明 x的值應>=0
7.求經常使用對數函數
函數頭 double log10(double x)
說明 x的值應>0
8.求天然對數函數
函數頭 double log(double x)
說明 x的值應>0
9.求指數函數
函數頭 double exp(double x)
返回值 參數x的指數e的x平方。
10.求10的x次方函數
函數頭 double pow10(int x)
例如:pow10(-1) 結果爲0.100000
11.求x的y次方函數
函數頭 double pow(double x,double y)
例如:pow(2,-2) 結果爲0.250000
pow(0.2,2) 結果爲0.040000.
12.求正弦函數
函數頭 double sin(double x)
例如:sin(90*3.14159/180) 結果爲1.000000
13.求餘弦函數
函數頭 double cos(double x)
例如:cos(90*3.14159/180) 結果爲0.0
14.求正切函數
函數頭 double tan(double x)
例如:tan(45*3.14159/180) 結果爲1.0
2)經常使用的類型轉換函數
1.將字符串轉換成浮點數函數
函數頭 double atof(char *x)
例如:12.三、0123e2,轉換結果將是:12.三、12.3.若是不是正確的實數形式,轉換結果將取前面若干個能組成實數的字符。例如:1A2.34五、0.1b23e2,轉換的結果將爲1.0、0.1。
2.將字符串轉換成整數函數
函數頭 int atoi(char *x)
例如:十二、1200等,轉換的結果將是:十二、1200等。若是不是正確的整數形式,轉換結果將取前面若干個能組成整數的字符對應的證書。例如:1A二、12B00,轉換的結果將爲一、12.
3)經常使用的字符處理函數
1.判斷是否英文字母函數
函數頭 int isalpha(int x)
例如:isalpha(49) 結果爲0(49對應的字符是‘1’)(假)
isalpha('a') 結果爲非0(真)
2.判斷是否英文小寫字母函數
函數頭 int islower(int x)
例如:islower(97) 結果爲非0(真)
islower('A') 結果爲0(假)
3.判斷是否英文大寫字母函數
函數頭 int isupper(int x)
例如:isupper(97) 結果爲0(97對應的字符是‘a’)(假)
isupper('A') 結果爲非0(真)
4.判斷是否數字字符函數
函數頭 int isdigit(int x)
例如:isdigit(49) 結果爲非0(49對應的字符是‘1’)(真)
isdigit('a') 結果爲0(假)
5.將大寫字母轉換爲小寫字母函數
函數頭 int tolower(int x)
例如:tolower(49) 結果爲‘1’(49對應的字符是‘1’)
tolower('A') 結果爲‘a’
說明:若參數x中存放室大寫字母,則返回值是對應的小寫字母。若是參數x中存放的字符不是大寫字母,則返回值等於x的原來值。
6.將小寫字母轉換爲大寫字母函數
函數頭 int toupper(int x)
例如:toupper(49) 結果爲‘1’(49對應的字符是‘1’)
toupper('a') 結果爲‘A’
7.將字符轉換成ASCII代碼值函數
函數頭 int toascii(int x)
例如:toascii(129) 結果爲1
toascii('a') 結果爲97(97對應的字符是‘a’)
說明:返回值在0-127之間。
4)其餘經常使用函數
1.能發出鳴笛聲的函數
函數頭 void sound(int x)
功能:按照參數x赫茲的頻率連續發出鳴笛聲。
2.中指鳴笛聲的函數
函數頭 void nosound()
功能 停止由sound()函數發出的鳴笛聲。
3.延時函數
函數頭 void delay(int x)
功能 延時參數x毫秒。
4.隨機數發生器初始化函數
函數頭 void randomize()
功能 對隨機數發生器進行初始化
5.隨機數發生函數
函數頭 int randoom(int num)
功能 產生一個從0到num-1之間的隨機整數。