只是一个简单的问题,有这个:
fftw_complex *H_cast;
H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
有什么区别:
H_cast= reinterpret_cast<fftw_complex*> (H);
和
H_cast= reinterpret_cast<fftw_complex*> (&H);
非常感谢提前
安东尼奥
只是一个简单的问题,有这个:
fftw_complex *H_cast;
H_cast = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*M*N);
有什么区别:
H_cast= reinterpret_cast<fftw_complex*> (H);
和
H_cast= reinterpret_cast<fftw_complex*> (&H);
非常感谢提前
安东尼奥
回答当前问题
不同的是,他们做了两件完全不同的事情!
注意:您没有告诉我们是什么H
,因此无法自信地回答这个问题。但一般原则适用。
对于第一种情况是明智的代码,H
应该是指向实例的指针(void*
可能键入?) 。fftw_complex
你会这样做来告诉编译器这H
真的是 a fftw_complex*
,然后你就可以使用它了。
要使第二种情况成为明智的代码,H
应该是具有与 class 相同的内存布局的类的实例fftw_complex
。我想不出一个令人信服的理由让自己陷入这种境地,这很不自然。基于此,由于您没有向我们提供有关的信息H
,我认为这几乎可以肯定是一个错误。
原始答案
主要区别在于,在第二种情况下,您可以搜索源代码reinterpret_cast
(并希望确保每次使用都清楚地记录在案并且是必要的恶)。
但是,如果您要转换void*
为另一种指针类型(这里是这种情况吗?),那么最好使用它static_cast
(也可以轻松搜索)。
H_cast= reinterpret_cast<fftw_complex*> (H);
这将转换 H 内部的指针类型(或整数本身,如果 H 是整数类型)并告诉编译器“这是一个指针。停止思考它是什么,它现在是一个指针”。H 用作您存储类似指针的地址的地方。
H_cast= reinterpret_cast<fftw_complex*> (&H);
这会将 H 的地址(它是指向任何类型 H 的指针)转换为指向“fftw_complex”的指针。修改 H_cast 的内容现在将改变 H 本身。
如果 H 不是指针,您将需要第二个,如果是,通常是第一个。有相反的用例,但它们不常见且丑陋(尤其是重新解释 int 或 - 上帝禁止 - 将 double 作为指针)。
指针转换始终作为 reinterpret_cast 执行,因此当从或转换为 void * 时,c 样式转换、static_cast 或 reinterpret_cast 之间没有区别。
Reinterpret_casts 通常保留在最丑陋的地方,其中 c 风格的演员表和 static_casts 用于无害的演员表。您基本上使用 reinterpret_cast 将某些代码标记为非常丑陋:
float f = 3.1415f;
int x = *reinterpret_cast<int *>(&f);
这样,这些丑陋的不安全演员表是可搜索/可搜索的。