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