2

我试图了解代码的功能,但由于这部分,我无法理解一个非常重要的部分。您能否解释一下 float* 是什么意思,以及当我们使用 *x 时它与 x 有何不同?

为什么每次迭代后 f1 和 f2 的值都会发生变化?是因为 IplImages[0] 和 IplImages[1] .toPointer 吗?请解释。

List<IplImage> IplImages;

float* f1 = (float*)IplImages[0].ImageData.ToPointer();
float* f2 = (float*)IplImages[1].ImageData.ToPointer();
.
.
.
.
if (*(f2 + row * imageWidth) > m)
 {
   m = *(f2 + row * imageWidth);
   .....
 }
4

2 回答 2

11

在 C# 中,括号中的任何数据类型都表示强制转换。在这种情况下,它正在转换为浮点指针。C# 中的*表示指针类型。指针是特殊的数据类型,它“指向”内存中保存数据的区域。将其视为操纵地址。在您的代码中:

if (*(f2 + row * imageWidth) > m)

该代码被用作解引用指针。这在英语中的意思是“获取指向的地址并将andf2的乘积添加到它,然后取消引用(取消引用只是意味着返回存储在的数据加上 and 的乘积)并查看它是否大于. 这是一个视觉效果:rowimageWidthf2rowimageWidthm

                       -------------------------------------------
Memory Location -->    | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 |
                       -------------------------------------------
            Data -->   |  86  |  130 | 190  |  221 |  12  | 99   |
                       -------------------------------------------

如果f2等于1000,则*f2返回86*(f2 + 1)会回来130的。现在在我的示例中,我假设float占用了一个字节的存储数据。但它没有。在 CLR 中,float占用 4 个字节(您可以在此处查看)。所以(f2 + 1)实际上等于 1004 并且实际上会返回12. 这称为指针算术。算法可能因不同的处理器而异。如果浮点数为 8 个字节长,则(f2 + 1)等于1008.

因为 C# 的自动垃圾收集器有时想要重新定位堆上的东西,并且因为指针可以操作通常无法操作的数据,所以指针在 C# 中是不安全的,必须包装在一个unsafe块中才能使用。

于 2014-09-30T16:21:56.223 回答
1

float*指的是只能在unsafe中使用的指针。指针就是这样,指向内存中某个位置的指针。使用它们的原因通常是性能,尽管在许多情况下可以实现相同的结果而不会在安全代码中过多地降低性能。

于 2014-09-30T16:21:34.313 回答