今天看代码遇到了一个函数,类似如下:
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)