• 十三、结构类型(3)——结构与函数


    结构作为函数参数

    int numberOfDays(struct  date d);

    (1)整个结构可以作为参数的值传入函数

    (2)这时候是在函数内新建一个结构变量,并复制调用者的结构的值

    (3)也可以返回一个结构

    (4)这与数组完全不同

    输入结构

    #include<stdio.h>
    
    struct point{
        int x;
        int y;
    };
    
    void getStruct(struct point);//读入一个结构体
    void output(struct point);//输出一个结构体 
    
    int main()
    {
        struct point y={0,0
        };    
        
        getStruct(y);
        output(y);
    
        return 0;
     }  
     
     void getStruct(struct point p)//读入一个结构体
     {
         scanf("%d",&p.x);
         scanf("%d",&p.y);
         printf("%d,%d
    ",p.x,p.y);
     }
     
     
    void output(struct point p)//输出一个结构体 
    {
        printf("%d,%d",p.x,p.y);
    }

    (1)没有直接的方式可以一次scanf一个结构

    (2)如果我们打算写一个函数来读入结构(——>)

    (3)但是读入的结构如何送回来呢?

    (4)记住C在函数调用时是传值的

    ——所以函数中的p与main中的y是不同的。

    ——在函数读入了p的数值之后,没有任何东西回到main,所以y还是{0,0}。

     解决的方案

     (1)之前的方案,把一个结构传入了函数,然后再函数中操作,但是没有返回回去

    ——问题在于传入函数的是外面那个结构的克隆体,而不是指针

    传入结构和传入数组是不同的

     (2)在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者

    int main()
    {
        struct point y={0,0
        };    
        
        y=inputPoint();
        output(y);
    
        return 0;
     }  
     struct point inputPoint()//读入一个结构体
     {
         struct point temp; //创建一个临时的结构变量。 
         scanf("%d",&temp.x);
         scanf("%d",&temp.y);
         return temp;  //把临时结构变量返回给调用者。 
     }

     

    也可以把y的地址传给函数,函数的参数类型是指向一个结构的指针。不过那样的话,访问结构的成员的方式需要作出调整。(看结构指针参数部分)

     指向结构的指针

    用   ->  表示指针所指的结构变量中的成员。

    #include<stdio.h>
    
    struct date{
        int month;
        int day;
        int year;
    }myday;
        
    int main()
    {
        struct date *p=&myday;
        
        (*p).month=12;
        p->year=2018;
        
        printf("%i-%i-%i",p->year,p->month,p->day); 
    
        return 0;
     }  

    结构指针参数

    struct point* inputPoint(struct point *p);//读入一个结构体
    int main()
    {
        struct point y={0,0
        };    
        
        inputPoint(&y);  //把y的地址传给函数,函数的参数类型是指向一个结构的指针
        output(y);
    
        return 0;
     }  
     struct point* inputPoint(struct point *p)//读入一个结构体
     {
         scanf("%d",&(p->x));
         scanf("%d",&(p->y));
         return p; 
     }

    (1)好处是传入传出只是一个指针的大小

    (2)如果需要保护传入的结构不被函数修改

    const struct point  *p

    (3)返回传入的指针是一种套路

  • 相关阅读:
    Linux各主要发行版的包管理命令对照
    JDK 生成数字证书
    AbatorForEclipse插件使用总结
    [转载]在rhel 6 x86_64 上安装oracle 11g xe
    【转载】PL/SQL配置连接ORACLE
    Archlive新年第一棒: 基于2.6.37稳定内核的archlive20110107
    基于Arch的live系统
    【转】MyEclipse 9.0正式版官网下载(附Win+Llinux激活方法、汉化包)
    Exception in thread main java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFacto
    MyEclipse 8.6插件下载
  • 原文地址:https://www.cnblogs.com/Strugglinggirl/p/9079973.html
Copyright © 2020-2023  润新知