1.结构作为函数参数
当然一旦你声明了结构,你就有了一种自己定义的数据类型,好像int float一样.那么当然,int,float可以作为函数的参数,你的这种结构类型呢,也可以作为函数的参数. 比如说我们现在有个函数numberofdays,它的参数就是一个struct date.那么现在这个参数的形式,明显,这个参数呢就是一个结构变量.
我们来看一个这样的程序的例子:
我们声明了一个结构叫做date.然后我们有俩函数,一个叫isleap,从这个名字我们就可以大概猜出来这个函数是这一天所在的那一年是否是闰年.另一个叫numberofdays.用来返回这个月的天数.我们在main里面做的事情是,输入今天的日期,然后再进行判断,最后再输出明天的日期.
2.输入结构:
相对于int,float这种基础类型呢,我们都知道说scanf,printf都有直接的方式%d,%f,我们就可以做他们的输入和输出.那么你自己定义的结构,你显然不可能指望说我有个%什么什么东西呃直接把那个结构变量的地址取出来交给scanf或者直接把这个结构变量交给printf它就能帮我们输入或者输出了,这事儿他显然没有那么聪明啊.他不可能知道你自己定义的那个内容,你自己声明的那种类型里头有什么东西,需要怎样去输入和输出,他不知道.所以呢,如果我们打算自己写一个的函数,这个函数能够读入一个结构,如果我们把程序写成这个样子,它能不能帮我们读入这个结构呢?
我们运行一下这个程序,输入12,23,输出0,0.显然不能.
3.解决方案
一:创建一个临时结构变量,最后再返回给调用者.
即
我们来看一下这段程序:
我们输入12 23,输出结果也是12 23,表明我们的结果是正确的.
二:结构指针作为参数
有了这个方法,我们应该把程序改造成什么样呢?
我们改造说,我们有个getstruct函数,这个getstruct要的是一个指针,所以我们调用它的时候给了它这个指针.这个时候呢,我们还是让它做了返回,我们在这个函数内部呢,去取得了p所指的那个x,取得了p所指的那个y,然后我们做了scanf,把那些值给赋进去,再进行输出,最后我们把这个p给返回去了.这其实是一个非常常用的套路,就是我传进来一个指针,我在里头对这个指针的所指的那些东西做一定的处理之后呢,我又把这个指针返回去了,这样做的好处就是我将来可以把它串在其他函数的调用当中.你看我们下面紧接着就出现了我们另外做了一个print函数,这个print函数也要一个指针, 也是要一个struct指针,而且我们还在前面很好心的加上了const,因为我们只做print这一件事嘛.我们再回头看看这个output函数,它的参数是一个s t的结构体变量,我们在程序里通过*访问调用getstruct返回的值(一个指针)的结构体变量,进行输出.
实际上我们还可以做更加邪恶的事情哦: