因为我在讨论中被告知“通过不兼容的指针类型进行别名是未定义的行为”(例如double d; int *p = (int *)&d;
以下问题:
是否可以将(double *)
转换为(double **)
,例如double *d1; double **d2 = &d2
和使用d2[0][y]
之类的语法,希望与d1[y]
相同?
我知道它不是通过不兼容的指针类型完全混叠,但是我不确定。背景是我希望有一个在二维数组(=图像)上运行的函数,但我希望能够只传递图像的一行或一列。
答案 0 :(得分:5)
double**
与double*
不兼容。转换是合法的,但您可以对结果做的唯一事情就是将其转换回来。这看起来或多或少显而易见:在32位机器上,double*
赢得的奖金甚至与double
相同。
但是您的示例并没有将double*
转换为double**
。它会创建一个新的double**
,指向double*
。这很好。
答案 1 :(得分:1)
是否允许将(double )转换为(double * ),例如double * d1; double ** d2 =& d2并使用类似d2 [0] [y]的语法,期望与d1 [y]相同?
当然不是,won't even compile。
但如果你的意思是:
double *d1;
double **d2 = &d2;
然后是的,上面的内容完全有效,因为d2[0][y]
可以被视为(*d2)[y]
,所以根本没有问题。
最后,请记住,在上面的代码中,您没有投射任何内容:&d2
已经是double**
类型。如果你需要投射某些内容,请使用C ++样式转换(static_cast
,dynamic_cast
,reinterpret_cast
等等。)而不是C样式转换。