zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    使用 Fetch
    实现一个联系客服对话框的前端部分
    javascript之Object.defineProperty的奥妙
    vue之nextTick全面解析
    创建元素和删除元素
    vue.js应用开发笔记
    待字闺中之最多连续数的子集
    HDU-1212-Big Number
    虚方法【仅仅有虚方法或者抽象方法才干被子类方法重写】
    利用localStorage实现对ueditor编辑内容定时保存为草稿
  • 原文地址:https://www.cnblogs.com/spring-hailong/p/6106687.html
Copyright © 2011-2022 走看看