天天看點

初級函數及執行個體(day8)

本次将通過兩個執行個體來學習函數。

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;