一、結構體變量做函數參數,使用引用和不用引用的區別
引用實際上是變量別名。效果等同于操作原對象。不傳引用新建了一個Stack副本,副本指針的改變不影響原變量,里面的指針永遠指向最初的地址,導致每次只是把這塊內存的值從a改到b而沒有實現自增。
結構作為函數參數的三種傳遞方式
1.傳遞結構成員
2.傳遞結構
3.傳遞結構的地址
===================================
//1.傳遞結構成員
#include
#include
//花唄還款簡單舉例
struct account
{
??? char * bankName;??? //銀行名稱
??? char * userName;??? //用戶名稱
??? double limit;?????? //賬戶當前可用額度
??? double max;???????? //賬戶總額度
};
//計算并返回當月應還款數
double payFor(double m1,double m2)
{
??? return m2-m1;
}
int main()
{
??? //初始化數據
??? struct account BOC;
??? BOC.bankName=”中國銀行”;
??? BOC.userName=”馬小云”;
??? BOC.max=10000;
??? BOC.limit=1562;
??? double result=payFor(BOC.limit,BOC.max);
??? printf(“用戶應還款%.2lf元,截至下月9日之前不算利息!\n”,result);
}
//2.傳遞結構
//結構體定義不變,后面照下面修改
//計算并返回當月應還款數
double payFor(struct account accounts)
{
??? return accounts.max-accounts.limit;
}
int main()
{
??? //初始化數據
??? struct account BOC;
??? BOC.bankName=”中國銀行”;
??? BOC.userName=”馬小云”;
??? BOC.max=10000;
??? BOC.limit=1562;
??? double result=payFor(BOC);
??? printf(“用戶應還款%.2lf元,截至下月9日之前不算利息!\n”,result);
}
//3.傳遞結構的地址??
//計算并返回當月應還款數
double payFor(const struct account *accounts)??? //因為指針指向可以改變,所以此處加上const起保護作用。
{
??? return accounts->max-accounts->limit;
}
int main()
{
??? //初始化數據
??? struct account BOC;
??? BOC.bankName=”中國銀行”;
??? BOC.userName=”馬小云”;
??? BOC.max=10000;
??? BOC.limit=1562;
??? double result=payFor(&BOC);
??? printf(“用戶應還款%.2lf元,截至下月9日之前不算利息!\n”,result);
}
延伸閱讀:
二、結構體參數調用歸納
1)結構體變量作為函數參數[實參與形參]時,形參結構體變量成員值的改變不影響對應的實參構體變量成員值的改變。
2)結構體數組或結構體指針變量作為函數參數[實參與形參]時,形參結構體數組元素[或形參結構體指針變量指向的變量]成員值的改變將影響對應的實參構體數組[或實參結構體指針變量指向的變量]成員值的改變。
3)結構體變量可作為函數的參數,函數可返回一結構體類數據
4)p=&b; 使結構體指針變量p指向結構體變量b的空間。
p->num:表示通過指針變量引用結構體變量b的成員num
5)p=a;或p=&a[0];將結構體指針變量指向結構體數組a。則:
①p->num:表示通過指針變量引用結構體數組元素的成員num的值。
②p->num++:表示通過指針變量先引用結構體數組元素的成員num的值,再使該元素的成員num的值加 1,先引用其值然后其加1。
③++p->num:表示使指向的元素的成員num的值加1,再引用其值。
6)p=a;或p=&a[0];表示將結構體指針變量p指向結構體數組a。
①(p++)->num:表示通過指針變量先引用結構體數組元素? 的成員num的值,再使指針變量本身加1,指針變量加1表示使指針變量指向結構體數組的下一個元素。
②(++p)->num:先使指針變量本身加1,先使使指針變量指向結構體數組的下一個元素,然后引用指針變量所指向的結構體數組元素的成員num的值。