函數(shù)的學(xué)習(xí)不得不說(shuō)還是挺好用的,使代碼的編寫(xiě)更加清晰唤锉。不管別人如何,還是得做好自己的學(xué)習(xí)總結(jié)别瞭。
什么是函數(shù)窿祥,為什么要使用函數(shù)?
- 函數(shù)是完成特定任務(wù)的獨(dú)立代碼單元蝙寨;
- 降低復(fù)雜性晒衩,避免重復(fù)代碼段,限制了改動(dòng)帶來(lái)的影響墙歪,隱含順序听系,改進(jìn)性能,
- 進(jìn)行集中控制虹菲,隱含數(shù)據(jù)結(jié)構(gòu)靠胜,隱含指針操作,隱含全局變量毕源。
我們可以對(duì)函數(shù)進(jìn)行調(diào)用浪漠,這樣避免了我們一大串代碼寫(xiě)在一個(gè)main函數(shù)中。
C語(yǔ)言中對(duì)函數(shù)的分類(lèi)霎褐,下面來(lái)簡(jiǎn)單總結(jié)一下郑藏。
有無(wú)返回值參數(shù)就不多說(shuō)了。void main 無(wú)返回值瘩欺,不過(guò)老師不建議使用無(wú)返回值的函數(shù),具體原因自己也不太清楚拌牲,待會(huì)可以百度一下俱饿;int main 有返回值。
形式參數(shù)和實(shí)際參數(shù)
- 形參出現(xiàn)在函數(shù)定義中塌忽,在整個(gè)函數(shù)體內(nèi)都可以使用拍埠,離開(kā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ù)量上白魂、類(lèi)型上、順序上應(yīng)嚴(yán)格一致上岗,否則會(huì)報(bào)錯(cuò)(類(lèi)型不匹配)
- 函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的福荸,只能把實(shí)參的值傳送給形參,在函數(shù)調(diào)用過(guò)程中肴掷,形參的值發(fā)生改變敬锐,實(shí)參的值不改變。
函數(shù)的返回值
函數(shù)的返回值只能通過(guò)return語(yǔ)句返回主調(diào)函數(shù)
return 語(yǔ)句的一般形式為:
return 表達(dá)式捆等;或 return (表達(dá)式)滞造;
函數(shù)的調(diào)用
在程序中是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的
C語(yǔ)言中函數(shù)調(diào)用的一般形式
函數(shù)名 (實(shí)際參數(shù)表) //無(wú)參函數(shù)則無(wú)實(shí)際參數(shù),如果有多個(gè)參數(shù)則用逗號(hào)隔開(kāi)栋烤。
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)行變量說(shuō)明是一樣的。目的是使辨析系統(tǒng)知道 被調(diào)函數(shù)的返回值類(lèi)型薯定。
- 其一般形式為
類(lèi)型說(shuō)明符 被調(diào)函數(shù)名(類(lèi)型 形參始绍,類(lèi)型 形參,......);
或者
類(lèi)型說(shuō)明符 被調(diào)函數(shù)名(類(lèi)型话侄,類(lèi)型.........)亏推;
C語(yǔ)言中規(guī)定以下幾種情況可以省去聲明;
1:被調(diào)函數(shù)的返回值是整型或字符型年堆,可以不對(duì)被調(diào)函數(shù)聲明吞杭;
2:被調(diào)函數(shù)聲明在主調(diào)函數(shù)之前
3:在所有函數(shù)之前預(yù)先說(shuō)明了各個(gè)函數(shù)的類(lèi)型
4:對(duì)庫(kù)函數(shù)的調(diào)用不需要再做說(shuō)明,但是必須把該函數(shù)的頭文件用include命令包含变丧。
函數(shù)的嵌套調(diào)用:
- C語(yǔ)言不允許嵌套定義函數(shù)芽狗,但是允許在一個(gè)函數(shù)的定義中出現(xiàn)另一個(gè)函數(shù)。這樣就出現(xiàn)了函數(shù)函數(shù)嵌套調(diào)用痒蓬。
計(jì)算 s=(22)!+(33)!
函數(shù)的遞歸調(diào)用:
- 一個(gè)函數(shù)在它的主體中調(diào)用他的自身稱(chēng)為遞歸調(diào)用童擎。這種函數(shù)稱(chēng)為遞歸函數(shù)滴劲。
執(zhí)行的過(guò)程中將反復(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è)求階層的問(wèn)題班挖,其中使用到了函數(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ù)組元素的類(lèi)型和函數(shù)形參的類(lèi)型保持一致站欺,這時(shí)數(shù)組元素是一個(gè)普通變量。
數(shù)組名作為函數(shù)參數(shù)時(shí)纤垂,要求形參和實(shí)參都必須是類(lèi)型相同的矾策。
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í)說(shuō)進(jìn)行的傳送只是地址的傳送巷送,也就是說(shuō)把實(shí)參數(shù)組的首地址賦給形參數(shù)組名,形參數(shù)組名取得改首地址后矛辕,也就等于有了實(shí)在的數(shù)組笑跛。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組付魔,共同擁有一段空間。
局部變量和全局變量
局部變量也稱(chēng)為內(nèi)部變量飞蹂,局部變量是在函數(shù)內(nèi)定義的几苍,其作用域僅限于函數(shù)內(nèi),離開(kāi)該函數(shù)后再使用這種變量是非法的陈哑。
注意:
1:主函數(shù)中定義的變量也只能在主函數(shù)中使用
2:形參變量是屬于被調(diào)函數(shù)的局部變量妻坝,實(shí)參變量屬于主調(diào)函數(shù)
3:允許在不同的函數(shù)中使用相同的變量名;
4:在復(fù)合語(yǔ)句中定義的變量惊窖,作用域僅限于復(fù)合語(yǔ)句中刽宪。全局變量也稱(chēng)為外部變量,它是在函數(shù)外部定義的界酒;他不從屬于哪個(gè)函數(shù)圣拄,他屬于一個(gè)程序源文件。其作用域是整個(gè)源程序毁欣。
*局部變量會(huì)屏蔽全局變量庇谆。
變量的存儲(chǔ)類(lèi)別:
- 動(dòng)態(tài)存儲(chǔ)方式與靜態(tài)存儲(chǔ)方式
從變量值的生存期來(lái)劃分可分為,靜態(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ǔ)空間的方式。
用戶(hù)存儲(chǔ)空間可以分為三部分:
(1)程序區(qū)
(2)靜態(tài)數(shù)據(jù)區(qū)
(3)動(dòng)態(tài)數(shù)據(jù)區(qū)
全局變量存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)执解,程序開(kāi)始時(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)局部變量的說(shuō)明:
局部變量屬于靜態(tài)存儲(chǔ)類(lèi)別欣簇,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配單元,整個(gè)程序運(yùn)行期間都不釋放坯约。
靜態(tài)局部變量在編譯時(shí)賦值熊咽,只賦值一次;
不賦初值的話闹丐,編譯器默認(rèn)符0横殴;