摘 要:函數(shù)調(diào)用方式是C語言程序設(shè)計(jì)課程教學(xué)的重點(diǎn),也是教學(xué)難點(diǎn)之一。本文簡述了兩種C語言函數(shù)調(diào)用方式的特點(diǎn),解答了學(xué)生在學(xué)習(xí)過程中遇到的常見問題。并通過典型案例分析,引導(dǎo)學(xué)生掌握C語言函數(shù)調(diào)用方式的運(yùn)用方法。
關(guān)鍵詞:C語言;教學(xué);函數(shù);調(diào)用方式
一、引言
程序設(shè)計(jì)語言是高等院校公共基礎(chǔ)教學(xué)的重要組成部分,也是計(jì)算機(jī)相關(guān)專業(yè)的基礎(chǔ)課程。C語言是一門十分優(yōu)秀的程序設(shè)計(jì)語言,不僅適用于教學(xué),而且實(shí)用性極強(qiáng),應(yīng)用廣泛。函數(shù)調(diào)用方式不僅涉及了函數(shù)信息傳遞的效率問題,而且還可能對程序運(yùn)行結(jié)果產(chǎn)生影響,因此也是C語言課程教學(xué)的一個(gè)重點(diǎn)。C語言函數(shù)調(diào)用有兩種方式,除了傳統(tǒng)的傳值調(diào)用之外,還增加了頗具特色的傳址調(diào)用方式。在授課中抓住要點(diǎn),鞭辟入里,精選典型案例進(jìn)行分析,取得了良好的教學(xué)效果。
二、傳值調(diào)用
傳值調(diào)用是在高級語言中普遍存在的函數(shù)調(diào)用方式,其形參和實(shí)參均為普通變量。在函數(shù)調(diào)用時(shí)把實(shí)參的值從左至右,一一對應(yīng)地傳遞給各個(gè)形參。這種傳遞是單向的,類似變量賦值,形參的值發(fā)生變化對實(shí)參毫無影響。選用求兩個(gè)整數(shù)的最大公約數(shù)這個(gè)程序作為案例,讓學(xué)生直觀認(rèn)識(shí)到函數(shù)定義、調(diào)用以及返回值等各個(gè)要素。定義一個(gè)gcd函數(shù)負(fù)責(zé)求最大公約數(shù),兩個(gè)形參均設(shè)置為普通類型int。算法采用輾轉(zhuǎn)相除法,代碼如下:
#include<stdio.h>
main()
{ int gcd(int m,int n); /*函數(shù)聲明*/
int m,n,k;
scanf("%d%d",&m,&n);
k=gcd(m,n); /*函數(shù)調(diào)用*/
printf("最大公約數(shù)是%d\n",k);
}
int gcd(int m,int n) /*函數(shù)定義*/
{ int a;
do
{ a=m%n;
m=n;
n=a;
}while(n!=0);
return(m); /*函數(shù)返回值*/
}
有的學(xué)生可能會(huì)認(rèn)為函數(shù)遞歸調(diào)用是一種新的調(diào)用方式,其實(shí)它是函數(shù)嵌套調(diào)用的特殊形式,本質(zhì)仍然屬于傳值調(diào)用。再次選取求最大公約數(shù)這個(gè)案例,采用遞歸調(diào)用方式。部分代碼如下:
int gcd(int m,int n) /*函數(shù)定義*/
{ int k;
if(n==0)
k=m;
else
k=gcd(n,m%n); /*遞歸調(diào)用*/
return(k); /*函數(shù)返回值*/
}
三、傳址調(diào)用
傳址調(diào)用方式在形式上與傳值調(diào)用方式的區(qū)別是,形參是指針變量,實(shí)參則是變量的地址。多數(shù)參數(shù)值都是通過傳值調(diào)用方式傳遞給被調(diào)函數(shù)的,但是在有些場合使用傳值調(diào)用并不恰當(dāng)。例如傳遞一個(gè)任意長度的數(shù)組,或者函數(shù)需要返回多個(gè)結(jié)果,或者傳遞需要占很多內(nèi)存空間的結(jié)構(gòu)體數(shù)據(jù)。遇到上述情況可以采用傳址調(diào)用方式,傳址調(diào)用使得被調(diào)函數(shù)能夠修改主調(diào)函數(shù)中變量的值,程序功能更加強(qiáng)大。
選取求某班C語言平均成績這個(gè)案例,定義函數(shù)average求平均成績。按照傳址調(diào)用的要求,該函數(shù)的形參應(yīng)該為指針類型int*。調(diào)用時(shí)把數(shù)組名作為實(shí)參傳遞給average函數(shù)的形參,在函數(shù)中利用指針訪問數(shù)組,計(jì)算出平均成績,返回給main函數(shù)即可。代碼如下:
#include<stdio.h>
#define N 30
main()
{ float average(int *p); /*函數(shù)聲明*/
int a[N],i;
float aver;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
aver=average(a); /*函數(shù)調(diào)用*/
printf("aver=%5.2f\n",aver);
}
float average(int *p) /*函數(shù)定義*/
{ float aver;
int i;
for(i=0,aver=0;i<N;i++,p++)
aver+=*p;
return(aver/N); /*函數(shù)返回值*/
}
有的學(xué)生可能會(huì)認(rèn)為數(shù)組作為形參是一種新的函數(shù)調(diào)用方式,即函數(shù)頭部變?yōu)閒loat average(int a[N]),其實(shí)它的本質(zhì)仍然屬于傳址調(diào)用。形參數(shù)組是不單獨(dú)占據(jù)內(nèi)存空間的,實(shí)參數(shù)組和形參數(shù)組的地址相同,各個(gè)元素在內(nèi)存中是重疊存放的,占據(jù)同一段內(nèi)存空間。實(shí)際上C語言把形參數(shù)組作為指針變量來處理,這也是形參數(shù)組可以不給出長度的原因所在。
四、結(jié)語
傳值調(diào)用方式和傳址調(diào)用方式各有特色,傳值調(diào)用使用簡便,程序的可讀性好,傳址調(diào)用的功能則更為強(qiáng)大。在教學(xué)中應(yīng)該重點(diǎn)分析兩種函數(shù)調(diào)用方式的特點(diǎn),引導(dǎo)學(xué)生仔細(xì)體會(huì),在程序設(shè)計(jì)中根據(jù)實(shí)際情況靈活運(yùn)用。
參考文獻(xiàn):
[1] 王曉東. C程序設(shè)計(jì)簡明教程(第二版)[M].北京:中國水利水電出版社, 2008.