本文档应用在写GPS串口解析驱动时,由于指针传递没处理好,导致内存泄漏,所以重新学习结构体与函数间传递
重点体会:返回值、结构体形参之间的调用关系
#include <iostream>
using namespace std;
const double pi = 3.1415;
// 功能:实现航向角转成弧度
struct GPS
{
float heading;
float lat;
float lon;
};
// 结构体做形参,函数返回值是结构体
struct GPS ang2rad_1(struct GPS gps)
{
gps.heading = gps.heading * pi / 180;
return gps;
};
// 结构体作为形参,函数返回值是结构体引用
struct GPS &ang2rad_2(struct GPS &gps)
{
gps.heading = gps.heading * pi / 180;
return gps;
};
// 结构体作为形参,与普通的类型值传递
void ang2rad_3(struct GPS gps)
{
gps.heading = gps.heading * pi / 180;
}
// 使用结构体指针作为形参
void ang2rad_4(struct GPS *gps)
{
if (!gps)
{
return;
}
gps->heading = gps->heading * pi / 180;
}
// 使用结构体别名作为形参
void ang2rad_5(struct GPS &gps)
{
gps.heading = gps.heading * pi / 180;
}
int main(void)
{
GPS gps_test1 = {100.00, 39.976823, 113.212134};
GPS gps_test2 = {100.00, 39.976823, 113.212134};
GPS gps_test3 = {100.00, 39.976823, 113.212134};
GPS gps_test4 = {100.00, 39.976823, 113.212134};
GPS gps_test5 = {100.00, 39.976823, 113.212134};
// 使用函数的返回值
gps_test1 = ang2rad_1(gps_test1);
cout << "使用函数的返回值:" << endl;
cout << gps_test1.heading << " " << gps_test1.lat << " " << gps_test1.lon << std::endl;
// 结构体作为形参,函数返回值是结构体引用
gps_test2 = ang2rad_2(gps_test2);
cout << "结构体作为形参,函数返回值是结构体引用:" << endl;
cout << gps_test2.heading << " " << gps_test2.lat << " " << gps_test2.lon << std::endl;
// 结构体作为形参,与普通的类型值传递
ang2rad_3(gps_test3);
cout << "结构体作为形参,与普通的类型值传递:" << endl;
cout << gps_test3.heading << " " << gps_test3.lat << " " << gps_test3.lon << std::endl;
// 使用结构体指针作为形参
ang2rad_4(&gps_test4);
cout << "使用结构体指针作为形参:" << endl;
cout << gps_test4.heading << " " << gps_test4.lat << " " << gps_test4.lon << std::endl;
// 使用结构体别名作为形参
ang2rad_5(gps_test5);
cout << "使用结构体别名作为形参:" << endl;
cout << gps_test5.heading << " " << gps_test5.lat << " " << gps_test5.lon << std::endl;
return 0;
}
结果如下:
使用函数的返回值:
1.74528 39.9768 113.212
结构体作为形参,函数返回值是结构体引用:
1.74528 39.9768 113.212
结构体作为形参,与普通的类型值传递:
100 39.9768 113.212
使用结构体指针作为形参:
1.74528 39.9768 113.212
使用结构体别名作为形参:
1.74528 39.9768 113.212