首页 > 代码库 > c/c++ 结构体传参问题

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 }

 

c/c++ 结构体传参问题