C C 學習筆記 三

2021-06-18 08:47:05 字數 2544 閱讀 8779

到目前為止,我們看到的所有函式中,傳遞到函式中的引數全部是按數值傳遞的(by value)。也就是說,當我們呼叫乙個帶有引數的函式時,我們傳遞到函式中的是變數的數值而不是變數本身。

但在某些情況下你可能需要在乙個函式內控制乙個函式以外的變數。要實現這種操作,我們必須使用按位址傳遞的引數(arguments passed by reference),就象下面例子中的函式duplicate

// passing parameters by reference

#include void duplicate (int& a, int& b, int& c)

int main ()

第乙個應該注意的事項是在函式duplicate的宣告(declaration)中,每乙個變數的型別後面跟了乙個位址符ampersand sign (&),它的作用是指明變數是按位址傳遞的(by reference),而不是像通常一樣按數值傳遞的(by value)。

當按位址傳遞(pass by reference)乙個變數的時候,我們是在傳遞這個變數本身,我們在函式中對變數所做的任何修改將會影響到函式外面被傳遞的變數。

a, b,c和呼叫函式時使用的引數(x, yz)聯絡起來了,因此如果我們在函式內對a 進行操作,函式外面的x 值也會改變。同樣,任何對b 的改變也會影響y,對c 的改變也會影響z>

這就是為什麼上面的程式中,主程式main中的三個變數x, yz在呼叫函式duplicate 後列印結果顯示他們的值增加了一倍。

如果在宣告下面的函式:

void duplicate (int& a, int& b, int& c)時,我們是按這樣宣告的:

void duplicate (int a, int b, int c)也就是不寫位址符ampersand (&),我們也就沒有將引數的位址傳遞給函式,而是傳遞了它們的值,因此,螢幕上顯示的輸出結果x, y ,z的值將不會改變,仍是1,3,7

這種用位址符 ampersand (&)來宣告按位址"by reference"傳遞引數的方式只是在c++中適用。在c 語言中,我們必須用指標(pointers)來做相同的操作。

按位址傳遞(passing by reference)是乙個使函式返回多個值的有效方法。

兩個不同的函式可以用同樣的名字,只要它們的參量(arguments)的原型(prototype)不同,也就是說你可以把同乙個名字給多個函式,如果它們用不同數量的引數,或不同型別的引數。例如:

// overloaded function

#include

int divide (int a, int b)

float divide (float a, float b)

int main ()

在這個例子裡,我們用同乙個名字定義了兩個不同函式,當它們其中乙個接受兩個整型(int)引數,另乙個則接受兩個浮點型(float)引數。編譯器 (compiler)通過檢查傳入的引數的型別來確定是哪乙個函式被呼叫。如果呼叫傳入的是兩個整數引數,那麼是原型定義中有兩個整型(int)參量的函式被呼叫,如果傳入的是兩個浮點數,那麼是原型定義中有兩個浮點型(float)參量的函式被呼叫。

為了簡單起見,這裡我們用的兩個函式的**相同,但這並不是必須的。你可以讓兩個函式用同乙個名字同時完成完全不同的操作。

inline指令可以被放在函式宣告之前,要求該函式必須在被呼叫的地方以**形式被編譯。這相當於乙個巨集定義(macro)。它的好處只對短小的函式有效,這種情況下因為避免了呼叫函式的一些常規操作的時間(overhead),如引數堆疊操作的時間,所以編譯結果的執行**會更快一些。

它的宣告形式是:

inline type name ( arguments ... )它的呼叫和其他的函式呼叫一樣。呼叫函式的時候並不需要寫關鍵字inline ,只有在函式宣告前需要寫。

遞迴(recursivity)指函式將被自己呼叫的特點。它對排序(sorting)和階乘(factorial)運算很有用。例如要獲得乙個數字n的階乘,它的數學公式是:

n! = n * (n-1) * (n-2) * (n-3) ... * 1更具體一些,5! (factorial of 5) 是:

5! = 5 * 4 * 3 * 2 * 1 = 120而用乙個遞迴函式來實現這個運算將如以下**:

// factorial calculator

#include

long factorial (long a)

int main ()

C C 學習筆記 檔案操作(三)

date 2020 08 03 檔案控制 include int fcntl int fd int cmd,1.複製檔案描述符 int fcntl int oldfd,f dupfd,newfd 成功返回目標檔案描述符 可能為newfd 失敗返回 1 oldfd 原始檔描述符 newfd 目標檔案描...

C C學習筆記

1.儲存型別 標準c語言為變數 常量 函式定義了4種儲存型別 extern,auto,static,register,它們分別用乙個關鍵字 儲存型別說明符 來說明。這4種儲存型別可分為兩種生存期限 永久的 即整個程式執行期間都存在 extern和static 和臨時的 即暫時儲存在堆疊和暫存器中 a...

C,C 學習筆記

1.求a的n次方 標頭檔案pow a,n a,n都為double 2.關於指標的一些小測試 includeusing namespace std int main int a 8 int m 3 cout 3.sort位於 algorithm 中,sort p,p n 預設公升序排列。4.inclu...