目錄
1.形式參數(shù)和實(shí)際參數(shù)
1.1形式參數(shù)
1.2實(shí)際參數(shù)
2.變量作為函數(shù)參數(shù)
3.數(shù)組作為函數(shù)參數(shù)
3.1數(shù)組元素作為函數(shù)參數(shù)
3.2一維數(shù)組名作為函數(shù)參數(shù)
3.3數(shù)組指針,即數(shù)組元素的地址作為函數(shù)參數(shù)
4.函數(shù)返回值
1.形式參數(shù)和實(shí)際參數(shù)
1.1形式參數(shù)
形參出現(xiàn)在被調(diào)函數(shù)當(dāng)中,在整個(gè)函數(shù)體內(nèi)都可以使用。形參在定義時(shí)編譯系統(tǒng)并不分配存儲(chǔ)空間,只有在調(diào)用該函數(shù)時(shí)才分配內(nèi)存單元。調(diào)用結(jié)束內(nèi)存單元被釋放,故形參只有在函數(shù)調(diào)用時(shí)有效,調(diào)用結(jié)束時(shí)不能再使用。
1.2實(shí)際參數(shù)
實(shí)參出現(xiàn)在主調(diào)函數(shù)當(dāng)中,當(dāng)函數(shù)調(diào)用時(shí),朱調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參,從而實(shí)現(xiàn)函數(shù)間的數(shù)據(jù)傳遞。傳遞方式有兩種:值傳遞和地址傳遞方式。
2.變量作為函數(shù)參數(shù)
當(dāng)形參定義為變量時(shí),實(shí)參可以是常量、變量和表達(dá)式,這種函數(shù)間的參數(shù)傳遞為值傳遞方式。值傳遞的特點(diǎn)是參數(shù)的“單向傳遞”;
int swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
return 0;
}
int main (void){
int a=3,b=4;
swap(a,b);
}
由于是值傳遞,單向傳遞,并不會(huì)改變a,b的值。
3.數(shù)組作為函數(shù)參數(shù)
3.1數(shù)組元素作為函數(shù)參數(shù)
數(shù)組元素又稱為下標(biāo)變量,它具有普通變量的一切性質(zhì),因此數(shù)組元素作為函數(shù)的實(shí)參進(jìn)行數(shù)據(jù)傳遞是與普通變量沒(méi)有任何區(qū)別,也是值傳遞
int swap(int a,int b)
{
int temp;
temp=a;
a=b;
b=temp;
return 0;
}
int main (void){
int a[]={3,4};
swap(a[0],b[0]);
}
同樣是值傳遞并不會(huì)改變a[0]的值。
3.2一維數(shù)組名作為函數(shù)參數(shù)
數(shù)組名是一個(gè)地址,是數(shù)組的首地址,因此用數(shù)組名作為函數(shù)的參數(shù)進(jìn)行數(shù)據(jù)傳遞時(shí),執(zhí)行的是地址傳遞方式。所謂地址傳遞,顧名思義實(shí)參傳遞的不是數(shù)據(jù)本身,而是數(shù)據(jù)存在的地址。函數(shù)調(diào)用時(shí),把數(shù)組名即數(shù)組的首地址作為實(shí)參傳遞給形參(必須是可接受地址的數(shù)組名或者指針變量),形參數(shù)組名取得首地址后就有了實(shí)在的數(shù)組,這時(shí)實(shí)質(zhì)上實(shí)參和形參是同一個(gè)數(shù)組,指向同一段存儲(chǔ)空間,實(shí)參的改變就是對(duì)形參的改變,所以傳址方式可看成是數(shù)據(jù)進(jìn)行了“雙向傳遞”。
3.3數(shù)組指針,即數(shù)組元素的地址作為函數(shù)參數(shù)
由于數(shù)組元素的地址的本質(zhì)仍然為地址,所以屬于地址傳遞方式。
int swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
return 0;
}
int main (void){
int arr[] = {1,2};
int *a = &arr[0];
int *b = &arr[1];
swap(a,b);
}
重點(diǎn):
- 數(shù)組元素(下標(biāo)變量)作為函數(shù)的參數(shù)進(jìn)行的數(shù)據(jù)傳遞是值傳遞方式,數(shù)組名(數(shù)組首地址)、數(shù)組元素的地址(&arr[0])作為函數(shù)參數(shù)進(jìn)行的數(shù)據(jù)傳遞是地址傳遞方式。
- 實(shí)參為數(shù)組名是,形參接收時(shí)可以有三種形式:帶下標(biāo)的數(shù)組名(arr[0])。不帶下標(biāo)的數(shù)組名(arr)、可接收地址值的指針變量名(*a)。由于是參數(shù)組和形參數(shù)組都指向同一段內(nèi)存單元,故它們操作的是同一批數(shù)據(jù),所以形參的改變就是改變了實(shí)參中的數(shù)據(jù)。
4.函數(shù)返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的代碼所得到的結(jié)果,這個(gè)結(jié)果通過(guò) return 語(yǔ)句返回。
return 語(yǔ)句的一般形式為:
return 表達(dá)式;
或者:
return (表達(dá)式);
有沒(méi)有( )都是正確的,為了簡(jiǎn)明,一般也不寫(xiě)( )。例如:
return max;
return a+b;
return (100+200);
對(duì)C語(yǔ)言返回值的說(shuō)明:
- 沒(méi)有返回值的函數(shù)為空類型,用void表示。例如:
void func(){
printf("http://c.biancheng.net\n");
}
一旦函數(shù)的返回值類型被定義為 void,就不能再接收它的值了。例如,下面的語(yǔ)句是錯(cuò)誤的:
int a = func();
為了使程序有良好的可讀性并減少出錯(cuò), 凡不要求返回值的函數(shù)都應(yīng)定義為 void 類型。
- return 語(yǔ)句可以有多個(gè),可以出現(xiàn)在函數(shù)體的任意位置,但是每次調(diào)用函數(shù)只能有一個(gè) return 語(yǔ)句被執(zhí)行,所以只有一個(gè)返回值(少數(shù)的編程語(yǔ)言支持多個(gè)返回值,例如Go語(yǔ)言)。例如:
//返回兩個(gè)整數(shù)中較大的一個(gè)
int max(int a, int b){
if(a > b){
return a;
}else{
return b;
}
}
如果a>b成立,就執(zhí)行return a,return b不會(huì)執(zhí)行;如果不成立,就執(zhí)行return b,return a不會(huì)執(zhí)行。
- 函數(shù)一旦遇到 return 語(yǔ)句就立即返回,后面的所有語(yǔ)句都不會(huì)被執(zhí)行到了。從這個(gè)角度看,return 語(yǔ)句還有強(qiáng)制結(jié)束函數(shù)執(zhí)行的作用。例如:
//返回兩個(gè)整數(shù)中較大的一個(gè)
int max(int a, int b){
return (a>b) ? a : b;
printf("Function is performed\n");
}
第 4 行代碼就是多余的,永遠(yuǎn)沒(méi)有執(zhí)行的機(jī)會(huì)。
下面我們定義了一個(gè)判斷素?cái)?shù)的函數(shù),這個(gè)例子更加實(shí)用:
#include <stdio.h>
int prime(int n){
int is_prime = 1, i;
//n一旦小于0就不符合條件,就沒(méi)必要執(zhí)行后面的代碼了,所以提前結(jié)束函數(shù)
if(n < 0){ return -1; }
for(i=2; i<n; i++){
if(n % i == 0){
is_prime = 0;
break;
}
}
return is_prime;
}
int main(){
int num, is_prime;
scanf("%d", &num);
is_prime = prime(num);
if(is_prime < 0){
printf("%d is a illegal number.\n", num);
}else if(is_prime > 0){
printf("%d is a prime number.\n", num);
}else{
printf("%d is not a prime number.\n", num);
}
return 0;
}
prime() 是一個(gè)用來(lái)求素?cái)?shù)的函數(shù)。素?cái)?shù)是自然數(shù),它的值大于等于零,一旦傳遞給 prime() 的值小于零就沒(méi)有意義了,就無(wú)法判斷是否是素?cái)?shù)了,所以一旦檢測(cè)到參數(shù) n 的值小于 0,就使用 return 語(yǔ)句提前結(jié)束函數(shù)。
return 語(yǔ)句是提前結(jié)束函數(shù)的唯一辦法。return 后面可以跟一份數(shù)據(jù),表示將這份數(shù)據(jù)返回到函數(shù)外面;return 后面也可以不跟任何數(shù)據(jù),表示什么也不返回,僅僅用來(lái)結(jié)束函數(shù)。
更改上面的代碼,使得 return 后面不跟任何數(shù)據(jù):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-765006.html
#include <stdio.h>
void prime(int n){
int is_prime = 1, i;
if(n < 0){
printf("%d is a illegal number.\n", n);
return; //return后面不帶任何數(shù)據(jù)
}
for(i=2; i<n; i++){
if(n % i == 0){
is_prime = 0;
break;
}
}
if(is_prime > 0){
printf("%d is a prime number.\n", n);
}else{
printf("%d is not a prime number.\n", n);
}
}
int main(){
int num;
scanf("%d", &num);
prime(num);
return 0;
}
prime() 的返回值是 void,return 后面不能帶任何數(shù)據(jù),直接寫(xiě)分號(hào)即可。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-765006.html
到了這里,關(guān)于C語(yǔ)言基礎(chǔ)知識(shí):函數(shù)中的參數(shù)與返回值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!