程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言函數參數的傳遞和值返回

C語言函數參數的傳遞和值返回

編輯:關於C語言
 

一、函數參數傳遞
1.形式參數和實際參數
函數的調用值把一些表達式作為參數傳遞給函數。函數定義中的參數是形式參數,函數的調用者提供給函數的參數叫實際參數。在函數調用之前,實際參數的值將被拷貝到這些形式參數中。
2.參數傳遞
先看一個例子:
void a(int); /*注意函數聲明的形式*/

main()
{
int num;
scanf(%d,&num);
a(num); /*注意調用形式*/
}

void a(int num_back) /*注意定義形式*/
{
printf(%d\n,num_back);
}

在主函數中,先定義一個變量,然後輸入一個值,在a()這個函數中輸出。當程序運行a(num);這一步時,把num的值賦值給num_back,在運行程序過程中,把實際參數的值傳給形式參數,這就是函數參數的傳遞。
形參和實參可能不只一個,如果多於一個時,函數聲明、調用、定義的形式都要一一對應,不僅個數要對應,參數的數據類型也要對應。

void a(int,float);

main()
{
int num1;
float num2;
scanf(%d,&num1);
scanf(%f,&num2);
a(num1,num2);
}

void a(int num1_back,float num2_back)
{
printf(%d,%f\n,num1_back,num2_back);
}

上面的例子中,函數有兩個參數,一個是整型,一個是浮點型,那麼在聲明、調用、定義的時候,不僅個數要一樣,類型也要對應。如果不對應,有可能使的編譯錯誤,即使沒錯誤,也有可能讓數據傳遞過程中出現錯誤。
再看一個例子:

void a(int);

main()
{
int num;
scanf(%d,&num);
a(num);
}

void a(int num)
{
printf(%d\n,num);
}

看上面的例子,形式參數和實際參數的標識符都是num,程序把實際參數num的值傳遞給形式參數num。有些人可能就不明白了,既然兩個都是num,為什麼還要傳遞呢?干脆這樣不就行了嗎:

void a();

main()
{
int num;
scanf(%d,&num);
a();
}

void a()
{
printf(%d\n,num);
}

其實不然,這就要涉及到標識符作用域的問題。作用域的意思就是說,哪些變量在哪些范圍內有效。一個標識符在一個語句塊中聲明,那麼這個標識符僅在當前和更低的語句塊中可見,在函數外部的其實地方不可見,其他地方同名的標識符不受影響,後面我們會系統講解作用域的問題。在這兒你就要知道兩個同名的變量在不同的函數中是互不干擾的。
前面將的都是變量與變量之間的值傳遞,其實函數也可以傳遞數組之間的值。看下面的例子:

void a(int []);

main()
{
int array[5],i;
for(i=0;i<5;i++) scanf(%d,&array[i]);
a(array);
}

void a(int array[])
{
int i;
for(i=0;i<5;i++) printf(%d\t,array[i]);
printf(\n);
}

這就是數組之間的值傳遞。注意他們的聲明和定義形式,和變量參數傳遞有什麼區別?有了後面的[]就表明傳遞的是一個數組。其中在定義的時候,也可以寫成void a(int array[5]);想想,如果我們寫成了int array[4]會有什麼情況發生?
目前我們只學了數組和變量,以後還會知道指針、結構,到那是,函數也可以傳遞它們之間的值。

二、函數值的返回
其實我們也可以把函數當作一個變量來看,既然是變量,那一定也可以有類型。還舉最前面的例子,現在要求在main()函數裡輸入一個整數作為正方形的邊長,在子函數裡求正方形的面積,然後再在主函數裡輸出這個面積。
我們前面的程序都是在子函數裡輸出的,現在要求在主函數裡輸出,這就需要把算好的值返回回來。先看例子:

int a(int); /*聲明函數*/

main()
{
int num,area;
scanf(%d,&num);
area=a(num); /*調用時的形式*/
printf(%d,area);
}

int a(int num)
{
int area_back;
area_back=num*num;
return area_back; /*返回一個值*/
}
和前面的程序有幾點不同:
(1).聲明函數類型時,不是void,而是int。這是由於最後要求的面積是整型的,所以聲明函數的返回值類型是整型。
(2).return語句 它的意思就是返回一個值。在C語言中,return一定是在函數的最後一行。
(3).調用函數的時候,由於函數有一個返回值,所以必須要用變量接受這個返回值(不是絕對的),如果我們不用一個變量接受這個值,函數還照樣返回,但是返回的這個值沒有使用。

上面的例子運行過程是這樣的,先把實參的值傳遞給形參,然後在子函數裡計算面積得到area_back,然後返回這個面積到主函數,也就是把area_back賦值給area,最後輸出。
前面說了,返回值有時不一定非要用一個變量來接受,我們可以把上面的程序簡化為:

int a(int);

main()
{
int num;
scanf(%d,&num);
printf(%d,a(num)); /*函數調用放在這兒*/
}

int a(int num)
{
int area_back;
area_back=num*num;
return area_back;
}
這樣函數返回的值就可以直接放到輸出緩沖區直接輸出了。
還可以再簡化為:

int a(int);

main()
{
int num;
scanf(%d,&num);
printf(%d,a(num));
}

int a(int num)
{
return num*num; /*直接在這兒返回*/
}

對於函數而言,一個函數只能返回一個值,如果想返回一組數值,就要使用數組或者結構或者指針。其實對於這些,還是返回一個值,只是這個值是一個地址而已。但是對於數組的返回有和變量不同,因為數組和地址是聯系在一起的。看一個例子:  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved