允许投射(双*)到(双**)

Casting (double *) to (double **) allowed?

本文关键字:许投射      更新时间:2023-10-16

因为我关注了一个讨论,其中被告知"通过不兼容的指针类型混叠是未定义的行为"(例如 double d; int *p = (int *)&d;以下问题:

是否允许对(double **)(double *),例如 double *d1; double **d2 = &d2并使用语法,例如d2[0][y]期望与d1[y]相同?

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

double**double*不兼容。 转换是合法的,但您唯一能做的就是将其丢弃。 这似乎或多或少很明显:在 32 位机器上,double*甚至不会具有与double相同的大小。

但是您的示例不会double*转换为double**。 它创建一个新的double**,指向double*。 这很好。

是否允许将 (double ( 转换为 (double *(,例如 double *d1; double **d2 = &d2 并使用 d2[0][y] 等语法期望与 d1[y] 相同?

当然不是,它甚至不会编译。

但如果你的意思是:

double *d1; 
double **d2 = &d2;

那么是的,以上是完全有效的,既然d2[0][y]可以看作是(*d2)[y],所以真的完全没有问题。

最后,请记住,在上面的代码中,您没有强制转换任何内容:&d2已经是 double** 类型。如果你必须投射某些东西,请使用C++样式的强制转换(static_castdynamic_castreinterpret_cast等(,而不是C样式的转换。