c/c++ 結構體傳參問題

c/c++的結構體傳參可以有三種方式:

  1、傳遞結構體變量,值傳遞

  2、傳遞結構體指針,地址傳遞

  3、傳遞結構體成員,可是值傳遞也可以是地址傳遞

 

根據代碼示例:

1、傳遞結構體變量

 

 1 #include<iostream>
 2 #define COMMANDLENGTH 100
 3 using std::cout;
 4 using std::endl;
 5 //注意 c和c++中struct和typedef struct有區別。
 6 struct Message{
 7     int oneField;
 8     short twoField;
 9     char command[COMMANDLENGTH];
10 }message;
11 //c++中結構體可在類中創建也可在類外創建,使用時區別就是在類中需要用類的對象去調用。
12 
13 class  NewMessage{
14 private:
15     //一般用來聲明變量
16 public:
17     Message Deliver(Message  stu);//我讓函數的返回值也是結構體,傳遞結構體變量
18 };
19 
20 void main()
21 {
22     NewMessage newMessage;//創建類對象
23     Message  tempMessage,recvMessage;24 
25     tempMessage.oneField = 5;
26     tempMessage.twoField = 10;
27     recvMessage = newMessage.Deliver(tempMessage);//recvMessage用來接收函數的返回值
28     cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
29     system("pause");
30 }
31 
32 inline Message  NewMessage::Deliver(Message  stu)
33 {
34     Message  temp;
35     temp = stu;
36     temp.oneField = 10;
37     temp.twoField = 20;
38     return  temp;
39 }

補充:函數的執行結果會將結構體的變量值成功修改!

 

2.傳遞結構體指針,地址傳遞

 

 1 #include<iostream>
 2 #define COMMANDLENGTH 100
 3 using std::cout;
 4 using std::endl;
 5 //注意 c和c++中struct和typedef struct有區別。
 6 struct Message{
 7     int oneField;
 8     short twoField;
 9     char command[COMMANDLENGTH];
10 }message;
11 //c++中結構體可在類中創建也可在類外創建,使用時區別就是在類中需要用類的對象去調用。
12 
13 class  NewMessage{
14 private:
15     //一般用來聲明變量
16 public:
17     Message Deliver(Message  *stu);//我讓函數的返回值也是結構體,地址傳遞
18 };
19 
20 void main()
21 {
22     NewMessage newMessage;//創建類對象
23     Message  *tempMessage = &message;//定義Message的指針變量指向message,也就是結構體的地址
24     Message  recvMessage;
25 
26     tempMessage->oneField = 5;
27     tempMessage->twoField = 10;
28     recvMessage = newMessage.Deliver(tempMessage);//傳遞的是結構體的指針地址
29     cout << recvMessage.oneField << endl << recvMessage.twoField << endl;
30     system("pause");
31 }
32 
33 inline Message  NewMessage::Deliver(Message  *stu)
34 {
35     Message  temp;
36     temp = *stu;
37     temp.oneField = 10;
38     temp.twoField = 20;
39     return  temp;
40 }

補充:函數的執行結果會將結構體的變量值成功修改!

 

注意:把一個完整的結構體變量作爲參數傳遞,要將全部成員值一個一個傳遞,費時間又費空間,開銷大。如果結構體類型中的成員很多,或有一些成員是數組,則程序運行效率會大大降低。在這種情況下,用指針做函數參數比較好,能提高運行效率。

3.傳遞結構體成員,值傳遞或地址傳遞

  這種情況就是結構體內部的成員變量作爲參數傳遞,可以使值傳遞,可以是地址傳遞。

 

 

 1 #include<iostream>
 2 #define COMMANDLENGTH 100
 3 using std::cout;
 4 using std::endl;
 5 //注意 c和c++中struct和typedef struct有區別。
 6 struct Message{
 7     int oneField;
 8     short twoField;
 9     char command[COMMANDLENGTH];
10 }message;
11 //c++中結構體可在類中創建也可在類外創建,使用時區別就是在類中需要用類的對象去調用。
12 
13 class  NewMessage{
14 private:
15     //一般用來聲明變量
16 public:
17     int Deliver(int onefield, int twofield);
18 };
19 
20 void main()
21 {
22     NewMessage newMessage;//創建類對象
23     Message  *valueMessage = &message;//定義Message的指針變量指向message,也就是結構體的地址
24     Message  addrMessage;
25     int  sum;
26     
27     //值傳遞
28     /*
29         addrMessage.oneField = 5;
30         addrMessage.twoField = 10;
31         sum = newMessage.Deliver(addrMessage.oneField, addrMessage.twoField);
32     */
33     
34     //指針地址傳遞,引用
35     valueMessage->oneField = 5;
36     valueMessage->twoField = 10;
37     sum = newMessage.Deliver(valueMessage->oneField, valueMessage->twoField);
38     cout << sum<<endl;
39     system("pause");
40 }
41 
42 inline int NewMessage::Deliver(int onefield, int twofield)
43 {
44     int a = onefield;
45     int b = twofield;
46     return a + b;
47 }

注:轉載僅作爲筆記使用,如有侵權,請聯繫刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章