函數(shù)的學(xué)習(xí)不得不說還是挺好用的,使代碼的編寫更加清晰。不管別人如何,還是得做好自己的學(xué)習(xí)總結(jié)。
什么是函數(shù),為什么要使用函數(shù)?
- 函數(shù)是完成特定任務(wù)的獨(dú)立代碼單元;
- 降低復(fù)雜性,避免重復(fù)代碼段,限制了改動(dòng)帶來的影響,隱含順序,改進(jìn)性能,
- 進(jìn)行集中控制,隱含數(shù)據(jù)結(jié)構(gòu),隱含指針操作,隱含全局變量。
我們可以對(duì)函數(shù)進(jìn)行調(diào)用,這樣避免了我們一大串代碼寫在一個(gè)main函數(shù)中。
C語言中對(duì)函數(shù)的分類,下面來簡(jiǎn)單總結(jié)一下。
有無返回值參數(shù)就不多說了。void main 無返回值,不過老師不建議使用無返回值的函數(shù),具體原因自己也不太清楚,待會(huì)可以百度一下;int main 有返回值。
形式參數(shù)和實(shí)際參數(shù)
- 形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用(如31行中的,a、b);
- 實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)中也不能使用(如43行的m、n),實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,
- 在進(jìn)行函數(shù)調(diào)用時(shí),都必須具有確定的值,以便把值傳給形參;
- 實(shí)參和形參在數(shù)量上、類型上、順序上應(yīng)嚴(yán)格一致,否則會(huì)報(bào)錯(cuò)(類型不匹配)
- 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,只能把實(shí)參的值傳送給形參,在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,實(shí)參的值不改變。
函數(shù)的返回值
函數(shù)的返回值只能通過return語句返回主調(diào)函數(shù)
return 語句的一般形式為:
return 表達(dá)式;或 return (表達(dá)式);
函數(shù)的調(diào)用
在程序中是通過對(duì)函數(shù)的調(diào)用來執(zhí)行函數(shù)體的
C語言中函數(shù)調(diào)用的一般形式
函數(shù)名 (實(shí)際參數(shù)表) //無參函數(shù)則無實(shí)際參數(shù),如果有多個(gè)參數(shù)則用逗號(hào)隔開。
int sum(int *a,int n)
{
int sum=0;
int i;
for (i = 0; i < n; ++i)
{
sum+=a[i];
}
return sum;
}
int main(int argc, char const *argv[])
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int s=0;
s=sum(a,10);
printf("累加結(jié)果為:%d\n",s );
return 0;
}
函數(shù)的調(diào)用還是挺好用的,使函數(shù)的結(jié)構(gòu)更加清晰,避免出錯(cuò)。
被調(diào)函數(shù)的聲明和函數(shù)原型:
- 在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對(duì)該被調(diào)函數(shù)進(jìn)行聲明,這于使用變量之前對(duì)變量進(jìn)行變量說明是一樣的。目的是使辨析系統(tǒng)知道 被調(diào)函數(shù)的返回值類型。
- 其一般形式為
類型說明符 被調(diào)函數(shù)名(類型 形參,類型 形參,......);
或者
類型說明符 被調(diào)函數(shù)名(類型,類型.........);
C語言中規(guī)定以下幾種情況可以省去聲明;
1:被調(diào)函數(shù)的返回值是整型或字符型,可以不對(duì)被調(diào)函數(shù)聲明;
2:被調(diào)函數(shù)聲明在主調(diào)函數(shù)之前
3:在所有函數(shù)之前預(yù)先說明了各個(gè)函數(shù)的類型
4:對(duì)庫(kù)函數(shù)的調(diào)用不需要再做說明,但是必須把該函數(shù)的頭文件用include命令包含。
函數(shù)的嵌套調(diào)用:
- C語言不允許嵌套定義函數(shù),但是允許在一個(gè)函數(shù)的定義中出現(xiàn)另一個(gè)函數(shù)。這樣就出現(xiàn)了函數(shù)函數(shù)嵌套調(diào)用。
計(jì)算 s=(22)!+(33)!
函數(shù)的遞歸調(diào)用:
- 一個(gè)函數(shù)在它的主體中調(diào)用他的自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。
執(zhí)行的過程中將反復(fù)調(diào)用自身,每調(diào)用一次都進(jìn)入新的一層。
long jiecheng(int n)
{
long ret = -1;
if(n<0)
printf("n<0,input error\n");
else if(n==0||n==1)
ret = 1;
else
ret = jiecheng(n-1)*n;
}
int main()
{
int n;
long y;
printf("input a intrager number:\n");
scanf("%d",&n);
y=jicheng(n);
printf("%d!=%ld\n",n,y);
return 0;
}
這是一個(gè)求階層的問題,其中使用到了函數(shù)的遞歸調(diào)用。其中的ret=jieceng(n-1)*n這里。
數(shù)組作為函數(shù)的參數(shù)
數(shù)組可以作為函數(shù)的參數(shù)使用,進(jìn)行數(shù)據(jù)傳送。數(shù)組作為函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素作為實(shí)參使用;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。
數(shù)組作為函數(shù)的參數(shù)
- 數(shù)組可以作為函數(shù)的參數(shù)使用,進(jìn)行數(shù)據(jù)傳送。數(shù)組作為函數(shù)參數(shù)有兩種形式,一種是把數(shù)組元素作為實(shí)參使用;另一種是把數(shù)組名作為函數(shù)的形參和實(shí)參使用。
判斷一個(gè)整型數(shù)組中個(gè)元素的值,如果大于0,則輸出該值,否則輸出0,
1:數(shù)組元素作為實(shí)際參數(shù)時(shí),數(shù)組元素的類型和函數(shù)形參的類型保持一致,這時(shí)數(shù)組元素是一個(gè)普通變量。
數(shù)組名作為函數(shù)參數(shù)時(shí),要求形參和實(shí)參都必須是類型相同的。
2:數(shù)組元素做函數(shù)參數(shù)時(shí),形參和實(shí)參是由編譯器分配的兩個(gè)不同的內(nèi)存單元,在函數(shù)調(diào)用時(shí)發(fā)生的值傳遞是把實(shí)參變量賦予形參變量。
在用數(shù)組名做函數(shù)參數(shù)時(shí),不是進(jìn)行值傳送,即不是把參數(shù)組的每一個(gè)元素的值都賦予形參組的各個(gè)元素。因?yàn)閷?shí)際形參數(shù)組并不存在,編譯數(shù)組并不為形參數(shù)組分配內(nèi)存。數(shù)組名就是數(shù)組的首地址,。數(shù)組做函數(shù)參數(shù)時(shí)說進(jìn)行的傳送只是地址的傳送,也就是說把實(shí)參數(shù)組的首地址賦給形參數(shù)組名,形參數(shù)組名取得改首地址后,也就等于有了實(shí)在的數(shù)組。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段空間。
局部變量和全局變量
局部變量也稱為內(nèi)部變量,局部變量是在函數(shù)內(nèi)定義的,其作用域僅限于函數(shù)內(nèi),離開該函數(shù)后再使用這種變量是非法的。
注意:
1:主函數(shù)中定義的變量也只能在主函數(shù)中使用
2:形參變量是屬于被調(diào)函數(shù)的局部變量,實(shí)參變量屬于主調(diào)函數(shù)
3:允許在不同的函數(shù)中使用相同的變量名;
4:在復(fù)合語句中定義的變量,作用域僅限于復(fù)合語句中。全局變量也稱為外部變量,它是在函數(shù)外部定義的;他不從屬于哪個(gè)函數(shù),他屬于一個(gè)程序源文件。其作用域是整個(gè)源程序。
*局部變量會(huì)屏蔽全局變量。
變量的存儲(chǔ)類別:
- 動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式
從變量值的生存期來劃分可分為,靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。
動(dòng)態(tài)存儲(chǔ)方式是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)分配存儲(chǔ)空間的方式。
用戶存儲(chǔ)空間可以分為三部分:
(1)程序區(qū)
(2)靜態(tài)數(shù)據(jù)區(qū)
(3)動(dòng)態(tài)數(shù)據(jù)區(qū)
全局變量存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū),程序開始時(shí)分配,結(jié)束時(shí)釋放,占據(jù)固定單元。 - 動(dòng)態(tài)存儲(chǔ)區(qū)存放以下數(shù)據(jù):
函數(shù)形參,
自動(dòng)變量(未加static修飾的局部變量),
函數(shù)調(diào)用的現(xiàn)場(chǎng)保護(hù)和返回地址。
static聲明局部變量
有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用后不消失而保留原值,這使就指定局部變量為“靜態(tài)局部變量”,用關(guān)鍵字static聲明。
對(duì)靜態(tài)局部變量的說明:
局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配單元,整個(gè)程序運(yùn)行期間都不釋放。
靜態(tài)局部變量在編譯時(shí)賦值,只賦值一次;
不賦初值的話,編譯器默認(rèn)符0;