C語言程序設計(第4章函數(shù))3

字號:

4.3 函數(shù)的調用與參數(shù)
     如果一個函數(shù)要使用參數(shù),它就必須定義接受參數(shù)值的變量。
    4.3.1 形式參數(shù)與實際參數(shù)
     函數(shù)定義時填入的參數(shù)我們稱之為形式參數(shù),簡稱形參,它們同函數(shù)內部的局部變量作用相同。形參的定義是在函數(shù)名之后和函數(shù)開始的花括號之前。
     調用時填入的參數(shù),我們稱之為實際參數(shù),簡稱實參。
     必須確認所定義的形參與調用函數(shù)的實際參數(shù)類型一致,同時還要保證在調用時形參與實參的個數(shù)出現(xiàn)的次序也要一一對應。如果不一致,將產(chǎn)生意料不到的結果。與許多其它高級語言不同,(是健壯的,它總要做一些甚至你不希望的事情,幾乎沒有運行時錯誤檢查,完全沒有范圍檢測。作為程序員,必須小心行事以保證不發(fā)生錯誤,安全運行。
    4.3.2 賦值調用與引用調用
     一般說來,有兩種方法可以把參數(shù)傳遞給函數(shù)。第一種叫做“賦值調用”(call by value),這種方法是把參數(shù)的值復制到函數(shù)的形式參數(shù)中。這樣,函數(shù)中的形式參數(shù)的任何變化不會影響到調用時所使用的變量。
     把參數(shù)傳遞給函數(shù)的第二種方法是“引用調用”(call by reference)。這種方法是把參數(shù)的地址復制給形式參數(shù),在函數(shù)中,這個地址用來訪問調用中所使用的實際參數(shù)。這意味著,形式參數(shù)的變化會影響調用時所使用的那個變量(詳細內容請參見后續(xù)章節(jié))。
     除少數(shù)情況外,C語言使用賦值調用來傳遞參數(shù)。這意味著,一般不能改變調用時所用變量的值。請看例4 - 9。
    [例4 - 9]
    main ( )
    {
     int t =10;
     printf("%d %d ",sqr(t),t); /* sqr(t)是函數(shù)調用,t是實參* /
    }
    int sqr(x) /* 函數(shù)定義,x是形式參數(shù)* /
    int x;
    {
     x = x * x;
     return (x);
    }
     在這個例子里,傳遞給函數(shù)sqr( )的參數(shù)值是復制給形式參數(shù)x的,當賦值語句x = x * x執(zhí)行時,僅修改局部變量x。用于調用sqr( )的變量t,仍然保持著值10。
    執(zhí)行程序:
    100 10
     切記,傳給函數(shù)的只是參數(shù)值的復制品。所有發(fā)生在函數(shù)內部的變化均無法影響調用時使用的變量。
    4.4 遞歸
     C語言函數(shù)可以自我調用。如果函數(shù)內部一個語句調用了函數(shù)自己,則稱這個函數(shù)是“遞歸”。遞歸是以自身定義的過程。也可稱為“循環(huán)定義”。
     遞歸的例子很多。例如定義整數(shù)的遞歸方法是用數(shù)字1,2,3,4,5,6,7,8,9加上或減去一個整數(shù)。例如,數(shù)字1 5是7 + 8;數(shù)字2 1是9 + 1 2; 數(shù)字1 2是9 + 3。
     一種可遞歸的計算機語言,它的函數(shù)能夠自己調用自己。一個簡單的例子就是計算整數(shù)階乘的函數(shù)factor( )數(shù)N的階乘是1到N之間所有數(shù)字的乘積。例如3的階乘是1×2×3,即是6。
     factor( )和其等效函數(shù)fact( )如例4 - 1 0所示。
    [例4 - 1 0 ]
    factor(n) /* 遞歸調用方法* /
    int n;
    {
     int answer;
     if (n==1)
     return (1);
     answer=factor(n-1) * n; /* 函數(shù)自身調用* /
     return(answer);
    }
    [例4 - 11 ]
    fact(n) /* 非遞歸方法* /
    int n;
    {
     int t,a n s w e r;
     answer = 1;
     for (t=1; t < = n; t ++)
     answer = answer * t;
     return(answer);
    }
     非遞歸函數(shù)fact( )的執(zhí)行應該是易于理解的。它應用一個從1開始到指定數(shù)值結束的循環(huán)。
     在循環(huán)中,用“變化”的乘積依次去乘每個數(shù)。
     factor( )的遞歸執(zhí)行比fact( )稍復雜。當用參數(shù)1調用factor( )時,函數(shù)返回1;除此之外的其它值調用將返回factor(n-1) * n這個乘積。為了求出這個表達式的值,用( n - 1)調用factor( )一直到n等于1,調用開始返回。
     計算2的階乘時對factor( )的首次調用引起了以參數(shù)1對factor( )的第二次調用。這次調用返回1,然后被2乘(n的初始值),答案是2(把printf( )語句插入到factor ( )中,察看各級調用及其中間答案,是很有趣的)。