0

只是一个简单的问题,有这个:

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); 

非常感谢提前

安东尼奥

4

3 回答 3

3

回答当前问题

不同的是,他们做了两件完全不同的事情!

注意:您没有告诉我们是什么H,因此无法自信地回答这个问题。但一般原则适用。

对于第一种情况是明智的代码,H应该是指向实例的指针(void*可能键入?) 。fftw_complex你会这样做来告诉编译器这H真的是 a fftw_complex*,然后你就可以使用它了。

要使第二种情况成为明智的代码,H应该是具有与 class 相同的内存布局的类的实例fftw_complex。我想不出一个令人信服的理由让自己陷入这种境地,这很不自然。基于此,由于您没有向我们提供有关的信息H,我认为这几乎可以肯定是一个错误。

原始答案

主要区别在于,在第二种情况下,您可以搜索源代码reinterpret_cast(并希望确保每次使用都清楚地记录在案并且是必要的恶)。

但是,如果您要转换void*为另一种指针类型(这里是这种情况吗?),那么最好使用它static_cast(也可以轻松搜索)。

于 2011-07-15T12:27:41.720 回答
1
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 作为指针)。

于 2011-07-15T12:40:15.210 回答
0

指针转换始终作为 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);

这样,这些丑陋的不安全演员表是可搜索/可搜索的。

于 2011-07-15T12:28:03.067 回答