C++ 需要强制转换语法才能访问旧的c api

C++ 需要强制转换语法才能访问旧的c api,c++,C++,我试图在两种数据类型之间编写一个粘合函数,但我似乎无法让编译器满意。一方面,我有一个指向数据块的指针,该数据块在逻辑上是一个n x 2数组,但声明为: double* pData=new double[2*n]; 另一方面,我有一个声明为 void Function(double data[][2], int n); 如果我记得我的c语法,那么数据[][2]实际上只是指向连续内存块的指针,但是编译器知道第二个维度的大小是2。因此,我希望获取pData并将其传递到Function(),而不使用

我试图在两种数据类型之间编写一个粘合函数,但我似乎无法让编译器满意。一方面,我有一个指向数据块的指针,该数据块在逻辑上是一个n x 2数组,但声明为:

double* pData=new double[2*n];
另一方面,我有一个声明为

void Function(double data[][2], int n);
如果我记得我的c语法,那么数据[][2]实际上只是指向连续内存块的指针,但是编译器知道第二个维度的大小是2。因此,我希望获取pData并将其传递到Function(),而不使用memcpy。我就是不能写演员阵容。我的想法是

Function((double [][2])pData,n)
可以,但编译器(MSVC 8)不喜欢这样。有人能告诉我正确的方式来写演员,让编译器高兴

void Function(double data[][2], int n);
double* pData = new double[2*n];
Function((double (*)[2])pData, n);
形式为
T[]
的函数参数与
T*
相同(甚至不是一些人所期望的
T*const
)。对于C和C++中的参数类型来说,这是一个特殊的情况。所以您的
double[][2]
遵循这个规则,T是
double[2]
。Typedefs有助于说明这一点:

typedef double T[2];
void Function(T data[], int n);
// identical to:
void Function(double data[][2], int n);
// also identical to:
void Function(double (*data)[2], int n);
因此,当T是
double[2]
时,您将
T*
写成
double(*)[2]


您也可以这样做:

void Function(double data[][2], int n);
double (*pData)[2] = new double[n][2];
Function(pData, n);
不需要强制转换,因为pData已经是正确的类型。或使用typedefs:

typedef double T[2];
T* pData = new T[n];

我只是想说清楚,安德鲁的回答

Function(&pData, n) 
不起作用,你会得到:

error C2664: 'Function' : cannot convert parameter 1 from 'double **' to 'double [][2]'
Roger Pate的compiles没有typedefs的语法如下:

Function( (double (*)[2]) &pData, n);

double data[][2]是double**,而您的pData是double*