小谈“双重指针”

小谈“双重指针”,第1张

小谈“双重指针

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5702700.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存