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

Float*是什么意思

在C#中,括号中的任何数据类型都表示强制转换。在这种情况下,它被强制转换为浮点指针。C#中的*表示一种指针类型。指针是一种特殊的数据类型,它"指向"内存中保存数据的区域。把它想象成操纵地址。在您的代码中:

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

该代码正被用作取消引用指针。在英语中,这句话的意思是"取f2指向的地址,加上rowimageWidth的乘积,然后取消引用(取消引用只是指返回f2存储的数据加上rowimageWidth的乘积),看看它是否大于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块中使用的指针。指针就是指向内存中某个位置的指针。使用它们的原因通常是性能,尽管在许多情况下,在安全代码中不会出现太多性能下降的情况下,也可以获得相同的结果。