双重指针的使用

今天看代码遇到了一个函数,类似如下:

struct CurvCurvInt
{
    Point m_Point[2];//交点在两条曲线上的坐标及参数等信息
    CurvCurvInt* next;//下一个交点
}

void findIntersectors(Curve* curve1, Curve* curve2, CurvCurvInt** firstInt1)
{
    *firstInt1 = new CurvCurvInt();
}

刚开始不太理解这里CurvCurvInt为什么要用双重指针,所以做了点思考。

如果我现在要使用findIntersectors这个函数,使用应如下:

int main()
{
    Curve* curve1 = new Curve();
    Curve* curve2 = new Curve();
    CurvCurvInt* firstInt0 = nullptr;
    
    findIntersectors(curve1, curve2, &firstInt0);
}

自然函数接口中就应该设计为双重指针。

如果不使用双重指针,调用方式为

-----------------------1--------------------------------

void findIntersectors(Curve* curve1, Curve* curve2, CurvCurvInt* firstInt1)

{

      firstInt1 = new CurvCurvInt();

}

CurvCurvInt* firstInt0 = nullptr;

findIntersectors(curve1, curve2, firstInt0);

会导致实参firstInt0拿不到求解后的值,仍为nullptr。

-----------------------2----------------------------------

void findIntersectors(Curve* curve1, Curve* curve2, CurvCurvInt* firstInt1)

{

        firstInt1 = new CurvCurvInt();

}

CurvCurvInt* firstInt0 = new CurvCurvInt();

findIntersectors(curve1, curve2, firstInt0);

此时相当于传指针,但如findIntersector中的实现仍然传不出来值。若findIntersector中的操作直接修改成员变量,如firstInt1->m_Point =  {xxx, xxx}可以将值传出来。

---------------------3----------------------------

void findIntersectors(Curve* curve1, Curve* curve2, CurvCurvInt** firstInt1);

CurvCurvInt** firstInt0 = nullptr;

findIntersectors(curve1, curve2, firstInt0);

这种方法的使用也是不对的,和第一种调用方法一样。

总而言之,此种情景主要是由于函数设计时希望由参数传递结果(使用&)造成的。

基本类型传结果有如下方式:

bool getIntPara(Curve* curv1, Curve* curv2, double& dT);

double a = 0;

getIntPara(curv1, curv2, &a);

那么,最上边原始函数可不可以写成下面这种形式呢?

void findIntersectors(Curve* curve1, Curve* curve2, CurvCurvInt* &firstInt1)

{

        firstInt1 = new CurvCurvInt();

}

CurvCurvInt* firstInt0 = nullptr;

findIntersectors(curve1, curve2, firstInt0);

理论上是可以的~这种即为“指针的引用”

关于“指针的指针”和“指针的引用”,二者达成的效果一致,只是在使用上略有不同,具体可以参考https://www.cnblogs.com/li-peng/p/4116349.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值