允许将 (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_castdynamic_castreinterpret_cast 等),而不是 C 样式转换。

【讨论】:

以上是关于允许将 (double *) 转换为 (double **) 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥此代码显示“无法将 'double' 转换为 'double*'”错误?

如何将int转换成double

在QT中如何将double转换为Qstring

c#中如何把string类型转换为double类型?

在C#中如何将int类型强制转换为double类型

是否可以将 C# double[,,] 数组转换为 double[] 而无需复制