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
ます。*(f2 + 1)
戻り130
ます。float
この例では、 1 バイトのストレージ データを使用すると想定しています。しかし、そうではありません。CLR では、float
4 バイトを占めます (ここで確認できます)。したがって(f2 + 1)
、実際には 1004 に等しくなり、実際には が返され12
ます。これはポインタ演算と呼ばれます。算術演算は、プロセッサによって異なる場合があります。float の長さが 8 バイトの場合、(f2 + 1)
と等しくなり1008
ます。
C# の自動ガベージ コレクターはヒープ上のデータを再配置する必要がある場合があり、ポインターは通常は操作できないデータを操作できるため、ポインターは C# では安全ではなく、使用するにはunsafe
ブロックにラップする必要があります。