在分配中无法将'double(*)[4]'转换为'double **'

时间:2018-05-13 02:06:24

标签: c++ pointers

我正在关注教程here。我遇到了以下几行代码。

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

当我编译它时,它会抛出错误

  

“在分配”

中无法将'double(*)[4]'转换为'double **'

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

4 个答案:

答案 0 :(得分:3)

你不能这样做。 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;

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

如果你想继续分配二维数组,

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

有两种方式可以引用这个内存块, 1,

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

和2.,

double** ppvalue

如果你想保持指向指针的变量,即 double** ppvalue = NULL; ppvalue = new double*[3]; (a) for(int i =0; i<3; i++) ppvalue[i]=new double[4]; (b) ,那么,

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

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

您发布的代码

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("%f\n", *(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("%f\n", 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("%f\n", ppvalue[i][j]); } } } 的偏移量,尽管它看起来非常漂亮和清晰。

我还会粘贴完整的测试代码,以便您可以进行游戏:

{{1}}

答案 3 :(得分:0)

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

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

您无法将该值存储在double **指针中。

P.S。你链接的“教程”只是荒谬的垃圾。