允许施放(双*)到(双**)?

时间:2013-12-10 10:09:04

标签: c++ pointers casting undefined-behavior strict-aliasing

因为我在讨论中被告知“通过不兼容的指针类型进行别名是未定义的行为”(例如double d; int *p = (int *)&d;以下问题:

是否可以将(double *)转换为(double **),例如double *d1; double **d2 = &d2 使用d2[0][y]之类的语法,希望与d1[y]相同?

我知道它不是通过不兼容的指针类型完全混叠,但是我不确定。背景是我希望有一个在二维数组(=图像)上运行的函数,但我希望能够只传递图像的一行或一列。

2 个答案:

答案 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_castdynamic_castreinterpret_cast等等。)而不是C样式转换。