无法在赋值中将"双精度 (*)[4]"转换为"双精度**"

cannot convert 'double (*)[4]' to 'double**' in assignment

本文关键字:双精度 转换 赋值      更新时间:2023-10-16

我在这里学习了一个教程。我遇到了以下代码行。

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

当我编译它时,它抛出了一个错误

"无法在分配中将'双 (*([4]' 转换为'双**'">

代码无效吗?或者我做错了什么。另外,如果可能的话,请描述如何声明指向多维数组的指针?

你不能这样做。double [3][4];分配 3 个数组的平面内存double[4]。本教程有错误。

using d4 = double [4];
// or typedef double d4[4];
d4* pvalue  = nullptr;
pvalue  = new double [3][4];
delete[] pvalue;

pvalue = new double [3][4];不正确。了解如何使用new为 2D 阵列分配内存。可能你想要像下面这样。

int main(void) {
double** pvalue  = NULL;        
/* first allocate for pvalue */  
pvalue  = new double *[3];  
for(int col = 0; col < 3 ; col++ )
/* allocate for each palue element */
pvalue[col] = new double [4];
return 0;
}

完成后,不要忘记通过调用delete来释放动态分配的内存。

你不能这样做。如果必须自己分配内存,请尝试:

double** pt=nullptr;
pt=new double[3];
for(std::size_t i=0;i<3;++i)
pt[i]=new double[4];

删除是一个反向的分配过程。

您需要注意的一件事是,您不应该使用range-based fornon-member begin and end functionsizeof operatorpt因为 不是数组。

如果你想保持二维数组的分配,

new double [3][4]

有两种方法可以引用此内存块, 1.,

double* pvalue  = NULL;
pvalue  = (double*)new double [3][4];

和 2.,

double (* parray)[4] = NULL;
parray = new double [3][4];

如果要保留指针到指针变量,即double** ppvalue,则,

double** ppvalue  = NULL;
ppvalue = new double*[3];     (a)
for(int i =0; i<3; i++)
ppvalue[i]=new double[4]; (b)

基本上,您需要为指针数组(a(分配内存,并使用具体地址填充这些指针。

您发布的代码

double** pvalue  = NULL;      // Pointer initialized with null 
pvalue  = new double [3][4];  // Allocate memory for a 3x4 array 

不起作用,因为它无法扣除pvalue的偏移量,尽管它看起来非常漂亮和清晰。

我还粘贴了完整的测试代码,以便您可以玩一玩:

#include <stdio.h>
int main() {
double* pvalue  = NULL;
pvalue  = (double*)new double [3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
*(pvalue+i*4+j) = (double)i*(double)j;
printf("%fn", *(pvalue+i*4+j));
}
}
double (* parray)[4] = NULL;
parray = new double [3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
parray[i][j] = (double)i*(double)j;
printf("%fn", parray[i][j]);
}
}
double** ppvalue  = NULL;
ppvalue = new double*[3];
for(int i =0; i<3; i++)
ppvalue[i]=new double[4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
ppvalue[i][j] = (double)i*(double)j;
printf("%fn", ppvalue[i][j]);
}
}
}

正如编译器明确告诉您的那样,new double [3][4]计算结果为double (*)[4]类型的指针

double (*pvalue)[4] = new double [3][4];

不能将该值存储在double **指针中。

附言您链接的"教程"只是无意义的垃圾。