我正在关注教程here。我遇到了以下几行代码。
double** pvalue = NULL; // Pointer initialized with null
pvalue = new double [3][4]; // Allocate memory for a 3x4 array
当我编译它时,它会抛出错误
“在分配”
中无法将'double(*)[4]'转换为'double **'
代码无效吗?或者我做错了。如果可能的话,请说明如何声明指向多维数组的指针?
答案 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 function
或sizeof 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。你链接的“教程”只是荒谬的垃圾。