在 C# 中,括号中的任何数据类型都表示强制转换。在这种情况下,它正在转换为浮点指针。C# 中的*
表示指针类型。指针是特殊的数据类型,它“指向”内存中保存数据的区域。将其视为操纵地址。在您的代码中:
if (*(f2 + row * imageWidth) > m)
该代码被用作解引用指针。这在英语中的意思是“获取指向的地址并将andf2
的乘积添加到它,然后取消引用(取消引用只是意味着返回存储在的数据加上 and 的乘积)并查看它是否大于. 这是一个视觉效果:row
imageWidth
f2
row
imageWidth
m
-------------------------------------------
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
块中才能使用。