Float*是什么意思?

Ari*_*ian 2 c# c#-4.0 opencvsharp

我试图理解代码是如何运作的,因为这一部分无法理解一个非常重要的部分.你能解释一下当我们使用*x而不是x时,浮动*意味着什么以及它有何不同?

为什么f1 anf 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);
   .....
 }
Run Code Online (Sandbox Code Playgroud)

Ice*_*ind 11

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

if (*(f2 + row * imageWidth) > m)
Run Code Online (Sandbox Code Playgroud)

该代码被用作解除引用指针.这是什么话,在英语中,"就拿指向的地址f2,并添加到它的产品rowimageWidth,然后取消引用(解引用只是意味着返回由存储在数据f2加上的产品rowimageWidth),看看它大于m这是一个视觉:

                       -------------------------------------------
Memory Location -->    | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 |
                       -------------------------------------------
            Data -->   |  86  |  130 | 190  |  221 |  12  | 99   |
                       -------------------------------------------
Run Code Online (Sandbox Code Playgroud)

如果f2等于1000,那么*f2就会回来86.*(f2 + 1)会回来的130.现在在我的例子中,我假设float占用了一个字节的存储数据.但事实并非如此.在CLR中,float占用4个字节(你可以在这里看到).所以(f2 + 1)实际上等于1004并且实际上会返回12.这称为指针算术.算术可能因处理器而异.如果一个浮点数是8个字节长,那么(f2 + 1)就等于1008.

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