次のコードは、 '*'は何をしていますか?C#ドキュメントの変数の前後にスターを付ける
for (Char* ptr1 = (Char*)bstr1.ToPointer(), ptr2 = (Char*)bstr2.ToPointer();
*ptr1 != 0 && *ptr2 != 0;
次のコードは、 '*'は何をしていますか?C#ドキュメントの変数の前後にスターを付ける
for (Char* ptr1 = (Char*)bstr1.ToPointer(), ptr2 = (Char*)bstr2.ToPointer();
*ptr1 != 0 && *ptr2 != 0;
これらは安全でないポインタです。 C#ポインタ、安全でないC#などを探します。等https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/unsafeとhttps://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types
すなわちコード、それは
for (Char* ptr1 = (Char*)bstr1.ToPointer(), ptr2 = (Char*)bstr2.ToPointer();
*ptr1 != 0 && *ptr2 != 0;
ptr1 = IntPtr.Add(ptr1, 1), ptr2 = IntPtr.Add(ptr2, 1))
(ptr1
とptr2
をインクリメントするコードの一部が少し異なることができることに注意してください。残念ながらIntPtr
には++
オペレータが存在しない)である場合
は、いずれかが'\0'
になるまで、bstr1
とbstr2
にコインドされた文字を繰り返します。名前、bstr1
とbstr2
はおそらくBSTR
(COMプログラミングで使用される、WindowsのUnicode文字列)です
考えるあなたは*ptr1
は、メモリ位置に含まれるchar
であることを持っているptr1
によって「指摘」。
これらはポインタです。通常、char、int、floatなどの基本変数は値として渡されます。つまり、その変数をメソッドに渡してそのメソッド内の値を変更すると、呼び出し元コンテキストの変数はまったく変更されません。複雑なテープ(クラス)が参照として渡されます。呼び出されたメソッドでそれらを変更し、呼び出し元でも変更されます。ポインタを使用すると、基本変数参照を渡すことができ、呼び出されたメソッドでそれらを変更することができ、呼び出し元でも変更されます。あなたはまた、ポインタで他のものの束を行うことができます。それらは複雑な構造です。私はC#でそれらと一緒に作業することをお勧めしません。
わずかな追加:あなたのメソッドのパラメータに 'ref'を使わない限り、実際には参照型と値型はどちらも参照渡しではありません。インスタンスへの実際の参照は値渡しになります。つまり、メソッドに渡されたインスタンスに別のインスタンスを再割り当てすることはできません。また、呼び出しコードに新しいインスタンスもあることを期待してください。もちろん、パラメータ*(それ自体が値渡し)によって*参照される*インスタンスのメンバを変更することもできます。 – HimBromBeere
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types – ThePerplexedOne
ソフトウェアまたはライブラリ(Windowsシステムを含む)のドキュメントに関する質問はSOの話題を受け取りました。 – HimBromBeere