本次将通過兩個執行個體來學習函數。
1.傳值函數
要求:寫一個比較兩個整型大小的函數
執行個體
int get_max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a, b = 0;
scanf("%d%d", &a, &b);
int max = get_max(a, b);
printf("最大值為%d", max);
return 0;
}
首先介紹一下函數執行順序:
函數是一個獨立的代碼塊,在主函數内調用時以語句形式執行,(可進入函數代碼塊進行監視,通過型參和實參的儲存位址及儲存内容的不同加深了解),該代碼塊隻在主函數調用時執行。
型參:型參在記憶體的儲存位址為獨立生成的,與實參無關,而且是臨時的,執行完該函數後型參便會銷毀。
實參:可以是常量、變量、表達式、函數等,無論實參是何種類型的資料,在進行函數調用時,實參必須有确定的值,以便把這些值傳送給形參,是以應該提前用指派、輸入等辦法使實參獲得确定值。
實參傳遞給型參值的過程僅僅是将實參的值傳遞給型參的過程,因為型參是确定的值,是以在記憶體中有相應的位址儲存該值,本質上說就是型參位址裡存儲的内容轉移到實參位址内,函數代碼塊随後通過該内容執行下一步,然後将型參的存儲位址及内容銷毀等待下一次調用。
在執行個體中,我們設定了一個get_max的函數,其結構為
函數名:get_max(實參1,實參2),該函數會傳回一個最大值,是以我們在主函數外聲明該get_max函數。
當調用該函數時,(型參1,型參2)的儲存位址内會接收到實參傳遞的數值,随後對兩個參數内儲存的值進行比較,型參1的值>型參2的值時,傳回型參1的值,反之則傳回2的值。傳回的值與實參的值類型保持一緻,故設定為int型。
設定一個整型的max變量接收該傳回值(即最大值)并列印。程式結束。
整個過程中,實參和型參隻傳遞了值,故為傳值函數。
2.傳址函數
要求:寫一個可以交換兩變量值的函數。
執行個體
void exc(int* pa, int* pb)
{
int tem = 0;
tem = *pa;
*pa = *pb;
*pb = tem;
}
int main()
{
int a, b;
printf("請輸入a,b\n");
scanf("%d%d", &a, &b);
printf("a = %d,b = %d\n", a, b);
int* pa = &a;
int* pb = &b;//建立指針
exc(&a, &b);
printf("a = %d,b = %d\n", a, b);
return 0;
}
思路:我們設定一個exc(a,b)的函數,不需要傳回值,當輸入實參1,實參2的變量名後,其值會互換。
這裡如果我們直接操作型參的話,a->型參1,b->型參2,随後設定一個中間變量tem,代碼如下:
void exc(int x, int y)
{
int tem;
tem = x;
x = y;
y = tem;
}
最終,執行完該函數後,x,y都會銷毀,a和b存儲的值完全沒變。
是以我們考慮用指針變量,将型參1,型參2直接指向實參1,實參2的儲存位址,讓函數直接通過位址修改實參1和實參2裡面的值。
其步驟如下:
1)建立儲存實參值的a,b的指針變量pa,pb;