允许将 (double *) 转换为 (double **) 吗?
Posted
技术标签:
【中文标题】允许将 (double *) 转换为 (double **) 吗?【英文标题】:Casting (double *) to (double **) allowed? 【发布时间】:2013-12-10 10:09:04 【问题描述】:因为我关注了一个讨论,其中被告知“通过不兼容的指针类型进行别名是未定义的行为”(例如 double d; int *p = (int *)&d;
以下问题:
是否允许将(double *)
转换为(double **)
,例如double *d1; double **d2 = &d2
和 使用类似 d2[0][y]
的语法期望与 d1[y]
相同?
我知道它不完全是通过不兼容的指针类型产生的别名,但我不确定。背景是我想要一个对二维数组(=图像)进行操作的函数,但我希望能够只传递图像的行或列。
【问题讨论】:
你不做演员。事实上,double **d2 = &d1 是有效的。 第一段,你的意思是double d; int *p = (int *)&d;
..?
@user1158692:是的,我更正了。
【参考方案1】:
double**
与 double*
不兼容。转换是合法的,但您唯一能对结果做的就是将其转换回去。这似乎或多或少很明显:在 32 位机器上,double*
的大小甚至与 double
的大小不同。
但您的示例没有将double*
转换为double**
。它创建一个新的double**
,它指向double*
。这很好。
【讨论】:
【参考方案2】:是否允许将 (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 样式转换。
【讨论】:
以上是关于允许将 (double *) 转换为 (double **) 吗?的主要内容,如果未能解决你的问题,请参考以下文章