注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

给函数传递和返回结构体  

2011-11-26 16:21:31|  分类: C & C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 最近看C++ Primer Plus,其中说到了给函数和结构体的问题。

其实和一般的函数类似,有两种方式,一种是按值传递,另一种是按地址传递。

先说说按值传递:

#include <iostream>
#include<cmath>

const double D2R=3.141592654/180;
const double R2D=1/R2D;

using namespace std;

struct Polar
{
    double distance;
    double angle;
};

struct Rect
{
    double x;
    double y;
};

Polar Rect2Polar(const Rect r)
{
    Polar p;
    p.distance=sqrt(r.x*r.x+r.y*r.y);
    p.angle=atan2(r.y,r.x);
    return p;
}

Rect Polar2Rect(const Polar p)
{
    Rect r;
    r.x=p.distance*cos(p.angle);
    r.y=p.distance*sin(p.angle);
    return r;
}

void ShowPolar(const Polar p)
{
    std::cout<<"Distance:"<<p.distance<<",Angle:"<<p.angle<<std::endl;
}

void ShowRect(const Rect  r)
{
    std::cout<<"X:"<<r.x<<",Y:"<<r.y<<std::endl;
}

int main()
{
    Rect r={3,4};
    ShowRect(r);
    Polar p=Rect2Polar(r);
    ShowPolar(p);
    r=Polar2Rect(p);
    ShowRect(r);
    cin.ignore();
    return 0;
}

这种操作将结构体视为一般的数据类型,如double等,简单易懂又安全,但是也会带来一些问题,就是结构体很大的时候,复制变量会带来更大的内存开销,影响运行速度。所以还有一种就是按引用传递,这就用到了指针。

#include <iostream>
#include<cmath>

const double D2R=3.141592654/180;
const double R2D=1/R2D;

using namespace std;

struct Polar
{
    double distance;
    double angle;
};

struct Rect
{
    double x;
    double y;
};

Rect* Polar2Rect(const Polar* pp)
{
    Rect* pr=new Rect;
    pr->x=pp->distance*cos(pp->angle);
    pr->y=pp->distance*sin(pp->angle);
    return pr;
}

Polar* Rect2Polar(const Rect* pr)
{
    Polar* pp=new Polar;
    pp->distance=sqrt(pr->x*pr->x+pr->y*pr->y);
    pp->angle=atan2(pr->y,pr->x);
    return pp;
}

void ShowPolar(const Polar* pp)
{
    std::cout<<"Distance:"<<pp->distance<<",Angle:"<<pp->angle<<std::endl;
}

void ShowRect(const Rect* r)
{
    std::cout<<"X:"<<r->x<<",Y:"<<r->y<<std::endl;
}

int main()
{
    Rect r={3,4};
    ShowRect(&r);
    Polar* pp=Rect2Polar(&r);
    ShowPolar(pp);
    delete pp;
    cin.ignore();
    return 0;
}
这样运行效果会高一些,但是也会带来一些小问题,其实还是老问题,使用了Rect2Polar或者Polar2Rect的函数需要使用delete执行内存回收工作。
另外还反映了一个小问题,就是许多人分不清什么时候使用句点(.)还是箭头(->),其实这个问题现在可以有明确的答案:指针中使用->,等效为*(r.x),结构中使用句点(.)。
  评论这张
 
阅读(2339)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016