函數(shù)(function)既有函數(shù)也有功能的意思,從本質(zhì)上說,函數(shù)就是用來完成一定功能的禾乘。
設(shè)計(jì)程序時(shí)冗荸,往往會(huì)將較大的程序切分為若干的模塊,每個(gè)模塊包含多個(gè)函數(shù)冬竟,每個(gè)函數(shù)實(shí)現(xiàn)一個(gè)特定功能。
- 從用戶使用角度看,除了可使用庫函數(shù)外改艇,還可編寫專用函數(shù)以供專人使用。
- 從函數(shù)形式看坟岔,函數(shù)分為無參函數(shù)谒兄、有參函數(shù)。
每個(gè)函數(shù)體都是一個(gè)塊社付,因此在函數(shù)內(nèi)聲明的自動(dòng)變量是函數(shù)的本地變量舵变。
函數(shù)的定義
C語言要求酣溃,程序中使用的函數(shù),必須先定義后使用纪隙。
類型標(biāo)識(shí)符 函數(shù)名(形式參數(shù)列表)
{
聲明部分
語句部分
}
函數(shù)聲明(declearation)的作用是把函數(shù)名赊豌、函數(shù)參數(shù)個(gè)數(shù)和類型等信息通知編譯器,以便在遇到函數(shù)調(diào)用時(shí)绵咱,編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法碘饼。
#include <stdio.h>
void star()
{
printf("********\n");
}
void message()
{
printf("hello world\n");
}
int main()
{
void star();
void message();
star();//********
message();//hello world
return 0;
}
函數(shù)名
函數(shù)名是指向函數(shù)的指針,函數(shù)名是指針變量(引用存儲(chǔ)器中某樣?xùn)|西的方法)悲伶。
當(dāng)創(chuàng)建函數(shù)同時(shí)也會(huì)創(chuàng)建一個(gè)函數(shù)名的指針變量艾恼,變量中保存函數(shù)地址。
只要把函數(shù)指針類型的參數(shù)傳遞給函數(shù)麸锉,就能調(diào)用它指向的函數(shù)钠绍。
void nl(void){
print("\n");
}
nl();
形參和實(shí)參
- 在定義函數(shù)時(shí)指定的形參,在函數(shù)未調(diào)用時(shí)花沉,形參并不占內(nèi)存中的存儲(chǔ)單元柳爽。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)形參才被分配內(nèi)存單元碱屁。在調(diào)用結(jié)束后磷脯,形參所占用的內(nèi)存單元也會(huì)被釋放掉。
$ vim max.c
#include <stdio.h>
int max(int x,int y)
{
return x>y ? x : y;
}
int main(void)
{
int x,y;
scanf("%d %d", &x, &y);
printf("x=%d y=%d max=%d\n", x, y, max(x,y));
return 0;
}
$ gcc max.c -o max
$ max
- 實(shí)參向形參的數(shù)據(jù)傳遞的是“值傳遞”娩脾,單向傳遞只能由實(shí)參傳給形參赵誓,而不能由形參傳給實(shí)參。實(shí)參和形參在內(nèi)存中占不同的存儲(chǔ)單元柿赊,實(shí)參無法得到形參的值俩功。
參數(shù)調(diào)用順序
#include <stdio.h>
int max(int x,int y)
{
return x>y ? x : y;
}
void nl(void){
printf("\n");
}
int main(void)
{
int x = 1;
printf("x=%d y=%d max=%d", x, ++x, max(x,++x));// x=3 y=3 max=2
nl();
return 0;
}
局部變量
每個(gè)變量都有一個(gè)作用域問題,即它們?cè)谑裁捶秶鷥?nèi)有效碰声。
定義變量可能有三種情況
- 在函數(shù)開頭定義
- 在函數(shù)內(nèi)的復(fù)合語句內(nèi)定義
- 在函數(shù)的外部定義
注意
- 主函數(shù)中定義的變量只在主函數(shù)中有效
- 不同函數(shù)中可使用同名變量
- 形參是局部變量
- 函數(shù)內(nèi)部绑雄,可在復(fù)合語句中定義變量,它們只在復(fù)合語句中有效奥邮,這種復(fù)合語句稱為“分程序”或“程序塊”万牺。
全局變量
程序的編譯單位是源程序文件,源文件可包含一個(gè)或多個(gè)函數(shù)洽腺。
在函數(shù)內(nèi)定義的變量是局部變量脚粟,在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量蘸朋。
全局變量可為本文件中其他函數(shù)所公用核无,它的有效范圍為從定義變量的位置開始到源文件結(jié)束。
為了便于區(qū)別全局變量和局部變量藕坯,C程序設(shè)計(jì)人員有一個(gè)習(xí)慣团南,將全局變量首字母大寫噪沙。
#include <stdio.h>
float Max=0,Min=0;
int main()
{
int length = 3;
float average(int arr[], int length);
int i, arr[length];
float avg;
printf("please enter %d integer:\n", length);
for(i=0; i<length; i++){
scanf("%d", &arr[i]);
}
avg = average(arr, length);
printf("max = %6.2f\nmin = %6.2f\navg = %6.2f\n", Max, Min, avg);
return 0;
}
float average(int arr[], int length)
{
int i;
float sum, avg;
Max = arr[0];
Min = arr[0];
sum = arr[0];
for(i=1; i<length; i++){
if(arr[i]>Max){
Max = arr[i];
}else if(arr[i] < Min){
Min = arr[i];
}
sum = sum + arr[i];
}
avg = sum/length;
return avg;
}
建議不在必要情況不要使用全局變量
- 全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元吐根。
- 全局變量會(huì)使通用性降低正歼,若函數(shù)中引用全局變量,那么執(zhí)行情況會(huì)受到有關(guān)的外部變量的影響拷橘。
- 全局變量過多會(huì)降低程序的清晰性