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 }