本文包括两个版本,都讲到了参数传递和指针传递,作者水平有限,如有不足之处,敬请指正!
一、
//<<<<<<<结构体的参数传递和指针传递>>>>>>>
//作者:wsg
//时间:2017年8月14日
//版本一:皆采用函数返回值为整个结构体的方式
#include <stdio.h>
struct gas
{
float distance;
float gals;
float mpg; //题目定义:mpg = distance * gals
};
struct gas func1(struct gas str); //申明函数func1()
struct gas func2(struct gas *ptr); //申明函数func2()
int main(int argc, char *argv[])
{
//定义并输入distance的值
float distance;
printf("请输入distance的值(带小数):\n");
scanf("%f", &distance);
//定义并输入gals的值
float gals;
printf("请输入gals的值(带小数):\n");
scanf("%f", &gals);
//将distance的值和gals的值(float型)赋给结构体str
struct gas str = {.distance = distance, .gals = gals};
//func1()函数传参,传递整个结构体
str = func1(str);
printf("mpg1 = %f\n", str.mpg); //打印mpg的值
//func2函数传参,传递一个地址进去,这里传递整个结构体的地址
str = func2(&str);
printf("mpg2 = %f\n", str.mpg); //打印mpg的值
return 0;
}
//定义函数func1(),形参为整个结构体,返回值也为整个结构体
struct gas func1(struct gas str)
{
str.mpg = (str.distance)*(str.gals);
return str; //返回值为整个结构体
}
//定义函数func2(),形参为一个指针,应传递一个地址
struct gas func2(struct gas *ptr)
{
ptr->mpg = (ptr->distance)*(ptr->gals);
return *ptr; //返回值为指针ptr解引用,相当于整个结构体
}
二、
//<<<<<<<结构体的参数传递和指针传递>>>>>>>
//作者:wsg
//时间:2017年8月14日
//版本二:使用指针传递时,不采用返回值方式
#include <stdio.h>
struct gas
{
float distance;
float gals;
float mpg; //mpg = distance * gals
};
struct gas func1(struct gas str);
void func2(struct gas *ptr);
int main(int argc, char *argv[])
{
//输入distance的值
float distance;
printf("请输入distance的值:\n");
scanf("%f", &distance);
//输入gals的值
float gals;
printf("请输入gals的值:\n");
scanf("%f", &gals);
//将distance的值和gals的值赋给结构体str
struct gas str = {.distance = distance, .gals = gals};
//func1函数传参
str = func1(str);
printf("mpg1 = %f\n", str.mpg);
//函数func2传参
func2(&str);
return 0;
}
//定义函数func1(),形参为整个结构体,返回值也为整个结构体
struct gas func1(struct gas str)
{
str.mpg = (str.distance)*(str.gals);
return str;
}
//定义函数func2(),形参为一个指针,应传递一个地址,由于该函数是void类型,所以没有返回值
void func2(struct gas *ptr)
{
ptr->mpg = (ptr->distance)*(ptr->gals);
printf("mpg2 = %f\n", ptr->mpg); //无返回值,只能在函数内部打印,而不能在main函数里打印
}