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 ...