再探函式引數

2021-07-30 15:26:04 字數 2090 閱讀 8851

c函式的所有引數均以「傳值呼叫」方式進行傳遞。

這意味著函式將獲得引數值的乙份拷貝,這樣函式可以放心修改這個拷貝值,而不必擔心會修改呼叫程式實際傳遞給它的引數。

普通資料型別主要包括:

如下面**所示:

#include 

void swap(int

x , int

y)int main()

我們原本是希望編寫乙個函式,其目的是交換呼叫程式所傳遞的這兩個引數的值。

但是,這個程式是無效的!

因為函式實際交換的是引數的拷貝,原先的引數值並沒有進行交換。

c函式的所有引數均以「傳值呼叫」方式進行傳遞,這意味著函式將獲得引數值的乙份拷貝。

如果被傳遞的引數是乙個指標,那麼函式將獲得這個指標的乙份拷貝。

如果函式對指標執行間接訪問操作,將會訪問指標所指向的記憶體位置。

如果想把乙個陣列名引數傳遞給函式,正確的函式形參應該是什麼樣呢?應該宣告為乙個指標還是乙個陣列呢?

由於陣列名的值實質上就是乙個指標,傳遞給函式的就是這個指標的乙份拷貝。下標引用實際上就是間接訪問的另一種形式,它可以對指標執行間接訪問操作,訪問指標指向的記憶體位置。引數(指標)實際上是乙份拷貝,但在這份拷貝上執行間接訪問操作所訪問的是原先的陣列。

所以,下面兩個函式原型都是相等的:

void clear_array(int

array , int n_element);

void clear_array(int arra*y , int n_element);(推薦)

首先,我們回答兩個問題:

為什麼陣列形參可以與任何長度的陣列匹配?

#include 

void clear_array(int *array , int n_element)

}int main()

; clear_array(vector , 10);

for (int i = 0; i < 10; ++i)

}

結構變數是乙個標量,它可以用於其他標量可以使用的任何場合。

因此,把結構作為引數傳遞給乙個函式是合法的,但這種做法往往並不適合。

#include 

#define product_size 5

typedef

struct transaction;

void print_receipt(transaction trans)

int main()

, 80 , 12.5 , 1000.0};

print_receipt(transaction1);

}

這種方法能夠產生正確的結果,但它的效率很低。

這是因為c語言的引數呼叫方式要求把引數的乙份拷貝傳遞給函式,如果這個結構佔據100個位元組的記憶體空間,將這個結構作為引數進行傳遞時,我們必須把100個位元組複製到堆疊中,以後再丟棄。

但是,如果我們傳遞給函式的是乙個指向結構的指標,由於指標比整個結構小很多,所以把它壓倒堆疊上的效率能提高很多,結構越大,把指向它的指標傳遞給函式的效率就越高。

但是,向函式傳遞指標的缺陷在於

#include 

#define product_size 5

typedef

struct transaction;

void print_receipt(const transaction *trans)

int main()

, 80 , 12.5 , 1000.0};

transaction *transaction2 = &transaction1;

print_receipt(transaction2);

}

建構函式再探

建構函式基礎知識 建構函式初始值列表 初始化與賦值 建構函式使用初始值列表還是在函式體中給資料賦值的區別在於,前者是初始化了它的資料成員,後者是對資料成員執行了賦值操作。在很多類中,初始化和賦值的區別事關底層效率問題 前者直接初始化資料成員,後者則先初始化再賦值。除了效率外更重要的是,一些資料成員必...

C 語句函式再探

1.表示式只計算,拋棄計算結果 2.空語句什麼也不做 3.switch case語句漏寫break,將會從匹配到的情況開始執行,直到語句結束 4.形參 實參 區域性變數 靜態區域性變數 所謂形參就是佔位之用,在函式開始時申請空間,並由傳入實參進行例項化 也可稱拷貝構造 一般是區域性的,即只能在函式體...

7 5 建構函式再探

目錄7.5.2 委託建構函式 7.5.3 隱式的類型別轉換 7.5.4 類的靜態成員 觀察下面兩段建構函式的 初始化bookno,units sold,revenue sale data const string s,unsigned cnt,double price bookno s units ...