Float*是什么意思
本文关键字:意思 是什么 Float | 更新日期: 2023-09-27 18:25:10
我试图理解一个代码是如何工作的,但由于这个部分,我无法理解一个非常重要的部分。你能解释一下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);
.....
}
在C#中,括号中的任何数据类型都表示强制转换。在这种情况下,它被强制转换为浮点指针。C#中的*
表示一种指针类型。指针是一种特殊的数据类型,它"指向"内存中保存数据的区域。把它想象成操纵地址。在您的代码中:
if (*(f2 + row * imageWidth) > m)
该代码正被用作取消引用指针。在英语中,这句话的意思是"取f2
指向的地址,加上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
。则CCD_ 13将返回CCD_。现在在我的示例中,我假设float
占用一个字节的存储数据。但事实并非如此。在CLR中,float
占用4个字节(您可以在此处看到)。因此CCD_ 17实际上等于1004,并且实际上返回CCD_。这被称为指针算术。不同处理器的运算可能不同。如果浮点值为8字节长,则(f2 + 1)
将等于1008
。
因为C#的自动垃圾收集器有时想要重新定位堆上的东西,而且指针可以操作通常无法操作的数据,所以指针在C#中是不安全的,必须封装在unsafe
块中才能使用。
float*
是指只能在unsafe
块中使用的指针。指针就是指向内存中某个位置的指针。使用它们的原因通常是性能,尽管在许多情况下,在安全代码中不会出现太多性能下降的情况下,也可以获得相同的结果。