結構體作為函式引數傳遞

2021-09-26 10:11:15 字數 1070 閱讀 7150

結構變數是乙個標量,它可以用於其他標量可以使用的任何場合,但把結構體作為引數傳遞給乙個函式要注重效率

例如下面這樣乙個結構體:

#define product_size  20

typedef structtransaction;

如果我們需要列印裡面的資料,函式原型為:

void print_receipt(transaction trans);

將結構體直接傳遞到函式引數,這樣結果正確,但是效率很低,因為c語言的引數傳遞呼叫方式要求把引數的乙份拷貝傳遞給函式,我們知道這個結構體佔據32個位元組的記憶體空間,要想把它作為引數進行傳遞,我們必須把32個位元組複製到堆疊中,以後再丟棄,但如果傳遞的是指標:

void print_receipt(transaction *trans);

傳遞的引數是乙個指向結構體的指標,指標比結構體小得多,所以把它壓到堆疊上效率要提高很多,傳遞指標的代價是我們必須在函式中使用間接訪問來訪問結構的成員,結構越大,把它指向它的指標傳遞給函式的效率越高。

向函式傳遞指標的缺陷在於函式現在可以呼叫程式的結構變數進行修改,如果我們不希望如此,可以在函式呼叫中使用關鍵字const來防止這類修改。

void print_receipt(transaction const *trans);

另外,需要對結構體裡面的變數進行修改,傳遞指標也是效率最高的一種:

//效率最低,結構體的乙份拷貝作為引數傳遞給函式並被修改,然後乙份修改後的結構拷貝從函式返回,結構體被複製了兩次

transaction compute_total_transaction(transaction trans)

//結構體被複製了一次

float compute_total_transaction(transaction trans)

//效率最高,呼叫程式的結構欄位total_amount被直接修改,它並不需要把整個結構作為引數傳遞給函式,也不需要把整個修改過後的結構作為返回值返回;

void compute_total_transaction(transaction *trans)

結構體作為引數傳遞

把結構體作為引數傳遞 1.對於我來這樣是很難理解的。結構體名不像陣列名那樣是這塊記憶體塊的位址。當用結構體指標做引數的時候。就應該用 來取出該結構體的位址,才能使用。2.當把就夠體名作為引數的時候。如 include struct name funds stan 定義結構體變數 double sum...

結構體作為函式引數(值傳遞,引用傳遞,指標傳遞)

一 值傳遞 include include using namespace std struct student void outcome student s 引用傳遞不會進行記憶體重新分配,因此和指標傳參類似,效率很高 void outcome student s 引用傳參 outcome stu...

結構體和結構體指標作為引數傳遞

結構體作為引數傳遞 include includeusing namespace std 宣告結構體 struct namect 函式宣告必須提供資料型別,但是可以不傳引數 struct namect getinfo void 宣告函式的返回值是乙個結構體,引數型別也是結構體,這裡結構體作為引數值直...