无法在赋值中将"双精度 (*)[4]"转换为"双精度**"
cannot convert 'double (*)[4]' to 'double**' in assignment
我在这里学习了一个教程。我遇到了以下代码行。
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 for
non-member begin and end function
或sizeof operator
pt
因为 不是数组。
如果你想保持二维数组的分配,
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 **
指针中。
附言您链接的"教程"只是无意义的垃圾。
相关文章:
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 在 c++ 中从双精度转换为字符串
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- C++,遇到将双精度转换为整数的问题
- 在C++中将双精度转换为intptr_t
- 将大双精度转换为科学记数法以用作字符串?
- 了解双精度转换与整数转换中的整数与截断关系
- 将 OLE 自动化日期 (OADate) 双精度转换为结构 tm,而不使用 VariantTime到SystemTime
- 无法在赋值中将"双精度 (*)[4]"转换为"双精度**"
- 将大双精度转换为无符号 int 期间堆栈损坏
- 将双精度转换为本地8位
- 警告从"双精度"转换为"int"
- 如何将双精度转换为浮点指针
- 将双精度转换为整数时出错
- 使用并集将双精度转换为十六进制再转换为双精度
- 是否有可以将每个双精度转换为唯一uint64_t,保持精度和顺序的功能?(为什么我找不到?
- 使用定点表示法将双精度转换为字符串,没有尾随零和机智的冲刺
- 在C++中将双精度转换为字符*/字符串
- 无法将双精度 [] [] 转换为双精度 **