C語言形式參數和實際參數的概念和在一個函數中交換外部變數的方法介紹
形式參數(formal argument)和實際參數(actual argument)是什麼?
void function(int n); //n為形式參數
int main { int times=5; function(times); //times為實際參數 }
void function(int n) { for(int i=0;i<n;i++) printf("hello\n"); }
在聲明一個參數時就創建了一個叫形式參數的變數,在上面的例子中形式參數是叫做n的變數。
函數調用function(times)把times的值5賦給了n,times被稱為實際參數,也就是說main()中的變數times的值被覆制給了function()中的新變數n。
在形參與實參傳遞的概念中有個很經典的例子,就是用一個函數交互兩個變數的值
#include <stdio.h> void swap(int a1, int b1); int main() { int a=0,b=1; swap(a,b); printf("a=%d , b= %d",a,b); } void swap(int a1, int b1) //無效的交互函數 { int temp=a1; a1=b1; b1=temp; }
初學的時候很容易寫出上面的代碼,但是沒有達到交換的目的,原因是這裡交換的只是函數中形式參數的值,實參只是把它的值複製給了形式參數,當函數作用完成後,函數中的參數也隨之銷毀了,如例子中想交換main中a,b的值,把它們的值分別複製給了swap函數中的a1,b1,然後在函數中a1和b1的值確實是交換了,但是隨之它們就銷毀了,main中的a,b的值還是原來的值。
想要交換a,b的值,其實就是相當於要在函數中改變變數的值,要做到這一點,就需要向形式參數傳遞實際參數的地址了,因為這樣把變數的地址複製到函數中的變數里,它們指向的是記憶體中的同一個地方,在函數中改變這個地方的值,那麼外部的變數的值也就改變了。
下麵的代碼可以到達交換目的
#include <stdio.h> void swap(int * a1, int * b1); int main() { int a=0,b=1; swap(&a , &b); //傳遞的是實參的地址 printf("a=%d , b= %d\n",a,b); } void swap(int * a1, int * b1) { int temp = *a1; *a1 = *b1; *b1 = temp; }