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