向函式傳遞結構的三種方式

2021-10-24 07:28:47 字數 3064 閱讀 3476

零、寫在前面

在程式設計的過程當中,我們經常會涉及到選擇資料的型別,在很多情況下,單單是普通的變數和陣列並不足以滿足我們的需求,這時候,c語言為我們提供了一種計較好用的資料型別——結構體

結構體給了我們更加靈活的操作空間,但是如何對於這些結構體的資訊進行操作,這就涉及到結構體與函式之間的互動了。以下我小結平日裡學習到的三種向函式傳遞結構的方式。

一、傳遞結構成員

有時候我們並不需要對於結構體的全體成員進行訪問,而只需要單個的或者個別幾個的成員便足矣。這時候我們只需要將結構體的部分成員對函式及逆行傳參即可。以下是實驗**

#include

struct person

;double

sum(

double x,

double y)

intmain()

printf

("張三乙個月的收入有%.2f元\n"

,sum

(zhangsan.salary,zhangsan.extra_gains));

return0;

}

以下是程式執行結果:

二、傳遞結構

當然,如果我不止是想呼叫單個成員,而是希望能夠更加方便地對整個結構體進行操作,我們能不能將整個結構體都傳入呢?

在現行的c語言標準下,是可以的!

我們來對上面的函式進行一次改下,實驗**如下:

#include

struct person

;double

sum(

struct person who)

intmain()

;printf

("張三乙個月的收入有%.2f元\n"

,sum

(zhangsan));

return0;

}

以下是實驗結果截圖

在這種情況下,實際上是為結構體創造了乙個名為「who」的自動結構體變數,然後將結構體各個成員變數初始化為zhangsan對應變數成員的副本。因此,通過該函式後變化的只是結構體的副本,而非結構體本身

我們對以上的實驗**再進一步改寫以做說明。

#include

struct person

;double

sum(

struct person who)

intmain()

;printf

("張三乙個月的收入有%.2f元\n"

,sum

(zhangsan));

printf

("此時zhangsan的extra成員的值為: %f\n"

, zhangsan.extra_gains)

;return0;

}

執行的結果如下:

我們從執行結果可以看到,雖然在求和函式中對extra成員進行了操作,但是再其後的列印顯示中其並未發生改變,說明函式是單獨為zhangsan結構體建立了乙個副本,而不是對其本身進行操作。

因此,傳遞結構體本身有兩個特點:

1.傳遞進入函式的一整個結構體,需要建立的副本有時候記憶體會比較大,因此在一開始的c語言標準中,並不允許將結構體傳遞進入函式當中,當然,隨著計算機的發展,在現行的標準當中已經允許我們這麼操作了。

2.進入函式的結構體本身變數的值並不會改變,改變的只是副本的值,如果需要改變原本結構體的值,可能還需要對結構體進行傳參的操作。

三、傳遞結構的位址那麼有沒有辦法不用傳那麼大記憶體的結構體,同時也能對結構體本身的值進行修改呢?方法還是有的,那就是傳遞結構的位址,也就是將指向結構體的指標作為引數傳入到函式當中,由於指標本身只占有4個位元組,記憶體較小,同時也能對結構體本身進行修改。

實驗**如下:

#include

struct person

;double

sum(

struct person *who)

//將指標作為引數

intmain()

;printf

("張三乙個月的收入有%.2f元\n"

,sum

(&zhangsan));

//將位址傳入函式當中

printf

("此時zhangsan的extra成員的值為: %.2f\n"

, zhangsan.extra_gains)

;return0;

}

實驗結果如下:

我們可以看到,zhangsan結構體的extra成員的值被修改了。因此,也可以看到傳遞結構體位址有以下三個特點:

1.傳入的引數記憶體小。傳遞位址只需要4個位元組的指標即可,不需要像方法二一樣將整個結構體的副本傳入,節省了記憶體空間

2.函式對原始結構體進行計算。與建立副本不同,該方法直接傳遞結構體的位址,(如**中的sun(&zhangsan))因此是對結構體本身進行操作,雖然在該演示中只是對結構體的部分變數進行了修改,但函式其本身是可以訪問結構體的全體成員的。

3.函式通過"->"運算子獲取相關成員的值,而不是像結構體通過「.」來獲取

三種函式的傳遞方式

檔名稱 作 者 張延飛 完成日期 2017年9月11日 版 本 號 v1.0 問題描述 兩種函式傳遞的方式 傳值和傳位址 輸入描述 兩個整數,代表交換前的值 程式輸出 兩個整數,代表交換後的值 include using namespace std void myswap intx,inty int...

函式引數傳遞的三種方式

問題及 1 檔名稱 my first blog.cpp 作 者 林志文 完成日期 2016年9月5日 版 本 號 v1.0 問題描述 交換兩個整型變數的swap函式的三個版本 輸入描述 兩個整數 程式輸出 交換後的兩個整數 includevoid myswap int p1,int p2 void ...

函式的三種值傳遞方式

關於函式引數的傳遞方式 傳值引數 實際引數的值被複製到由函式開闢的記憶體空間中,成為形參的初始值。完成引數值傳遞之後,函式體中的語句對形參的訪問 修改都是在這個標識物件上操作的,與實際引數無關。例項 include include using namespace std void swap int ...