之 函數調用與變量的作用域
但凡程序就離不開函數,不管是高級語言還是C語言,函數是組成程序的單位。形形色色的函數既扮演著自己的角色,又在總體中擔任著舉足輕重的角色。
函數的基本形式:
無參數函數一般形式
有參數函數一般形式
函數類型說明符 函數名)
{
函數體;
}
函數類型說明符 函數名)
{
函數體;
}
以一個程序實例來闡述函數的一些注意事項。
#include <stdio.h> float ave(float b[],int m); //函數聲明 main() { float a[20],aver; int j,n; printf("輸入班級的人數\n"); scanf("%d",&n); printf("輸入分數:\n"); for(j=0;j<n;j++) { scanf("%f",&a[j]); } /* 調用ave函數,a和n是實參,a是數組名,代表數組首地址,n是值。 */ aver=ave(a,n); printf("平均分是 %f\n",aver); } float ave(float b[],int m)//函數ave b[]和m是形參,數組b的接受的是a[]的首地址,m接受n的值 { int i; float aver1,sum=0; for(i=0;i<m;i++) { sum+=b[i]; } aver1=sum/m; return(aver1);//返回平均值給main函數,用來輸出 }
1.每個函數必須單獨定義,不允許嵌套定義,即不能在一個函數的內部再定義另一個函數
2. 形參:在進行函數定義時設定的參數
實參:在進行有參函數調用時所用的參數
3 .實參傳遞給形參的方式:
值傳遞值單向傳遞方式)
如上程序中的實參a傳遞給形參b[],a是數組名,代表的是數組的首地址。實參數組名a並不是將數據a中所有學生的成績傳送給了形參數組b,而是將實參數組的首地址傳遞給了b,從而使這兩個數組共用同一個存儲空間,即a[0]=b[0]......
地址傳遞方式
如上程序中的實參n傳遞給了形參m ,n和m都是實實在在的值。
需要注意的是:在被調函數中,形參的類型必須與實參要一致,比如:參數的a[]是float,那麼形參中的數組b[]也必須是float類型
4. 函數返回值
在被調函數內采用return語句獲得函數的返回值,一個函數利用return語句只能返回一個值。
return語句中的表達式的類型應該與函數類型說明是一致的。比如:程序中的,aver函數中的return(aver1)中的aver1的類型與函數aver的函數類型一樣,即都是float.
但是當return語句中的表達式的返回值類型與函數的類型不一致時候,應與函數類型說明符為准。系統會自動將return返回值轉換為函數類型說明符的類型。
當函數的返回值的數據類型是int時,在函數定義時,函數類型說明符可以省略,也就是說,系統默認的返回值類型是整型。
5. 函數的聲明
程序中一切都遵循先定義後使用的原則,函數也不例外。
上述程序中,aver函數定義在main函數之後,所以不遵循先定義後使用的原則,為了防止這種事情的發生,我們先用一個函數聲明來避免這一點,那就是在main函數之前加上的函數聲明語句:float ave(float b[],int m);
如果將函數aver放到main函數之前的話,就不用加這一條聲明語句了。
int m,n;
double fun(int x ,int y)
{
int m,n;
....
}
main()
{
int a,b;
if ()
{
int x,y;
}
}
1.局部變量
局部變量只能在局部使用。上述中的函數fun中的x,y和m,n只能在函數fun中有效,一旦出了fun的范疇就沒有用了。再比如if中的x和y只能在if()中使用。
2.全局變量
第一行的m和n,就是全局變量,這兩個變量在全部函數中都能使用
但是我們看到m和n和函數fun中的m和n重名了,那執行函數fun中的m和n的時候,到底用全局變量還是用局部變量,答案是局部變量。
本文出自 “趙玉強的博客” 博客,請務必保留此出處http://zhaoyuqiang.blog.51cto.com/6328846/1264485