因为我遵循了一个讨论,其中被告知“通过不兼容的指针类型进行别名是未定义的行为”(例如double d; int *p = (int *)&d;
以下问题:
是否允许强制(double *)
转换为(double **)
,例如double *d1; double **d2 = &d2
并d2[0][y]
使用类似于期望的语法d1[y]
?
我知道它不是通过不兼容的指针类型完全别名,但是我不确定。背景是我想要一个对二维数组(=图像)进行操作的函数,但我希望能够只传递图像的行或列。
因为我遵循了一个讨论,其中被告知“通过不兼容的指针类型进行别名是未定义的行为”(例如double d; int *p = (int *)&d;
以下问题:
是否允许强制(double *)
转换为(double **)
,例如double *d1; double **d2 = &d2
并d2[0][y]
使用类似于期望的语法d1[y]
?
我知道它不是通过不兼容的指针类型完全别名,但是我不确定。背景是我想要一个对二维数组(=图像)进行操作的函数,但我希望能够只传递图像的行或列。
double**
不兼容double*
。转换是合法的,但您唯一能对结果做的就是将其转换回去。这似乎或多或少很明显:在 32 位机器上, adouble*
甚至不会具有与 a 相同的大小double
。
但是您的示例不会将 a 转换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
is 已经是 type double**
。如果您必须转换某些内容,请使用 C++ 样式转换(static_cast
、dynamic_cast
、reinterpret_cast
等),而不是 C 样式转换。