2017-06-08 8 views
0

次のコードは、 '*'は何をしていますか?C#ドキュメントの変数の前後にスターを付ける

for (Char* ptr1 = (Char*)bstr1.ToPointer(), ptr2 = (Char*)bstr2.ToPointer(); 
        *ptr1 != 0 && *ptr2 != 0; 
+2

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/pointer-types – ThePerplexedOne

+0

ソフトウェアまたはライブラリ(Windowsシステムを含む)のドキュメントに関する質問はSOの話題を受け取りました。 – HimBromBeere

答えて

2

これらは安全でないポインタです。 C#ポインタ、安全でないC#などを探します。等https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/unsafehttps://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)) 

ptr1ptr2をインクリメントするコードの一部が少し異なることができることに注意してください。残念ながらIntPtrには++オペレータが存在しない)である場合

は、いずれかが'\0'になるまで、bstr1bstr2にコインドされた文字を繰り返します。名前、bstr1bstr2はおそらくBSTR(COMプログラミングで使用される、WindowsのUnicode文字列)です

考えるあなたは*ptr1は、メモリ位置に含まれるcharであることを持っているptr1によって「指摘」。

0

これらはポインタです。通常、char、int、floatなどの基本変数は値として渡されます。つまり、その変数をメソッドに渡してそのメソッド内の値を変更すると、呼び出し元コンテキストの変数はまったく変更されません。複雑なテープ(クラス)が参照として渡されます。呼び出されたメソッドでそれらを変更し、呼び出し元でも変更されます。ポインタを使用すると、基本変数参照を渡すことができ、呼び出されたメソッドでそれらを変更することができ、呼び出し元でも変更されます。あなたはまた、ポインタで他のものの束を行うことができます。それらは複雑な構造です。私はC#でそれらと一緒に作業することをお勧めしません。

+0

わずかな追加:あなたのメソッドのパラメータに 'ref'を使わない限り、実際には参照型と値型はどちらも参照渡しではありません。インスタンスへの実際の参照は値渡しになります。つまり、メソッドに渡されたインスタンスに別のインスタンスを再割り当てすることはできません。また、呼び出しコードに新しいインスタンスもあることを期待してください。もちろん、パラメータ*(それ自体が値渡し)によって*参照される*インスタンスのメンバを変更することもできます。 – HimBromBeere

関連する問題