十三、结构类型(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\n",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)返回传入的指针是一种套路

 

posted @ 2018-05-23 22:07  Strugglinggirl  阅读(282)  评论(0编辑  收藏  举报