C++ 如何在C/C+中调用**var+;第10.5章数字配方

C++ 如何在C/C+中调用**var+;第10.5章数字配方,c++,c,pointers,C++,C,Pointers,我在调用此函数时遇到问题: void powell(浮点p[],浮点**xi,整数n, 浮球ftol,内部*iter,浮球*fret, 浮动(*func)(浮动[]) 我不知道哪一个参数必须在**xi下才能运行我的代码 整个功能如下: void powell(float p[], float** xi, int n, float ftol, int* iter, float* fret, float (*func)(float[])) { void linmin(float p[],

我在调用此函数时遇到问题:

void powell(浮点p[],浮点**xi,整数n,
浮球ftol,内部*iter,浮球*fret,
浮动(*func)(浮动[])
我不知道哪一个参数必须在**xi下才能运行我的代码

整个功能如下:

void powell(float p[], float** xi, int n, float ftol, int* iter, float* fret, float (*func)(float[]))
{
    void linmin(float p[], float xi[], int n, float* fret, float (*func)(float[]));
    int i, ibig, j;
    float del, fp, fptt, t, *pt, *ptt, *xit;
    pt = vector(1, n);
    ptt = vector(1, n);
    xit = vector(1, n);
    *fret = (*func)(p);
    for (j = 1; j <= n; j++)
        pt[j] = p[j];
    for (*iter = 1;; ++(*iter)) {
        fp = (*fret);
        ibig = 0;
        del = 0.0;
        for (i = 1; i <= n; i++) {
            for (j = 1; j <= n; j++)
                xit[j] = xi[j][i];
            fptt = (*fret);
            linmin(p, xit, n, fret, func);
            if (fptt - (*fret) > del) {
                del = fptt - (*fret);
                ibig = i;
            }
        }
        if (2.0 * (fp - (*fret)) <= ftol * (fabs(fp) + fabs(*fret)) + TINY) {
            free_vector(xit, 1, n);
            free_vector(ptt, 1, n);
            free_vector(pt, 1, n);
            return;
        }
        if (*iter == ITMAX)
            nrerror("powell exceeding maximum iterations.");
        for (j = 1; j <= n; j++) {
            ptt[j] = 2.0 * p[j] - pt[j];
            xit[j] = p[j] - pt[j];
            pt[j] = p[j];
        }
        fptt = (*func)(ptt);
        if (fptt < fp) {
            t = 2.0 * (fp - 2.0 * (*fret) + fptt) * SQR(fp - (*fret) - del) - del * SQR(fp - fptt);
            if (t < 0.0) {
                linmin(p, xit, n, fret, func);
                for (j = 1; j <= n; j++) {
                    xi[j][ibig] = xi[j][n];
                    xi[j][n] = xit[j];
                }
            }
        }
    }
}
<代码>空鲍威尔(浮点p[]),浮点**席,int n,浮点ftol,int *ITER,浮点*FRET,浮点(*FUNC)(浮点[]) { void linmin(float p[],float xi[],int n,float*fret,float(*func)(float[]); int i,ibig,j; 浮点数del、fp、fptt、t、*pt、*ptt、*xit; pt=向量(1,n); ptt=向量(1,n); xit=向量(1,n); *fret=(*func)(p); 对于(j=1;j,双指针意味着函数需要指针的地址

void my_function(int **p_pointer)
{
  *p_pointer = new int[42];
}

int main(void)
{
   int * pointer = nullptr;
   my_function(&pointer);
   return 0;
}
在C++中,使用引用:可以避免双指针:

void another_function(int *& pointer)
{
  pointer = new int [256];
}

int main(void)
{
  int p = nullptr;
  another_function(p);
  return 0;
}

指针的一个主要问题是它们可以指向任何地方,一个已定义的位置或不是。测试指针的有效性很复杂,因为它取决于范围对于当前平台有效。对于引用,引用根据定义是有效的,因此无需执行有效性检查。

请编辑代码并修复缩进。代码不可读。您认为读者也会知道什么?此代码来自何处?它是库的一部分吗?是否有任何文档您希望使用代码实现吗?等等。此代码来自数字公式。它的第10.5章
xi
是一个“模拟”或“参差不齐”的2D数组,指向一些指向
float
的指针。请参见旧版本。注意:“
*变量
”表示函数需要指针。“code>**float”表示函数需要指针的地址。