1

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

是否允许强制(double *)转换为(double **),例如double *d1; double **d2 = &d2 d2[0][y]使用类似于期望的语法d1[y]

我知道它不是通过不兼容的指针类型完全别名,但是我不确定。背景是我想要一个对二维数组(=图像)进行操作的函数,但我希望能够只传递图像的行或列。

4

2 回答 2

5

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

但是您的示例不会将 a 转换double*double**. 它创建一个新double**的,指向double*. 这可以。

于 2013-12-10T10:21:56.137 回答
1

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

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

但如果你的意思是:

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

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

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

于 2013-12-10T10:19:52.960 回答