在c ++中声明一个静态数组作为指针

时间:2017-05-02 20:21:32

标签: c++ c arrays

以下是我最近看到的几行C ++代码。

double a[p][p];
for(i=0;i<p;i++)
{
    for(j=0;j<p;j++)
    {
        a[i][j] = m[i][j]; //m is sth we are given.
    }
}
dgeev_(&jobvl,&jobvr,&p,(double*)a,&lda,(double*)wr,(double*)wi,(double*)vl,
      &ldvl,(double*)vr,&ldvr,(double*)work,&lwork,&info);
// sth else..

dgeev_是一个函数,你可以在这里找到它的文档: http://www.netlib.org/clapack/old/double/dgeev.c

dgeev_以下列方式在头文件中声明,因此我们可以在C ++代码中使用C函数。

extern "C" {
void dgeev_(char*, char*, int*, double*, int*, double*, double*, double*,
 int*, double*, int*, double*, int*, int*);
}

正如我们所看到的,a是静态数组,而dgeev_需要第{4}类型的变量doublereal *

(double*)a在这做什么?

1 个答案:

答案 0 :(得分:2)

这可能是一个错误,或者是作者在玩弄你的伎俩。

他使用C风格的强制转换将值a“破解”为double*类型,以便可以将二维数组视为一维数组。 (doublereal is just an alias for double。)

问题是,a 不是一个double*,也不能实际转换为double*。我不知道 可以转换为什么,因为VGA只能在C ++中作为GCC扩展使用;没有标准的措辞可供咨询。我只是得出结论,这个程序有不确定的行为(虽然它可能看起来有效,因为这些东西实际上是如何在内存中布局的。)

如果作者希望能够使用单维索引安全地读取此数组,那么他应该以这种方式开始声明(可选地在其上方提供错觉的2D索引)数据存储)。