在 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块中才能使用。