2
class f2011fq1d
{
    unsafe public static void Main()
    {
       int a = 2;
       int b = 4;
       int* p;
       int* q;
       int[] ia = { 11, 12, 13 };
       p = &a; q = &b;
       Console.WriteLine(*p + a);
       Console.WriteLine(*q / *p);
       Console.WriteLine(*&a + *&b * 2);

       *p = a + *q;
       Console.WriteLine(a + *q);
       fixed (int* r = ia)
       {
           Console.WriteLine(*r + 3);
       }
    } 
}

このコードでは、構文の一部について混乱しています。たとえば、、は何int* pをしp = &aますか?そして最後の部分、それfixed (int* r = ia)は何をしますか?

ソースコードでは、いくつかの値も出力されますが、誰かが印刷されているものを説明できますか?

4

4 に答える 4

7

ポインターと「演算子のアドレス」を使用しています。これらは一般的に C/C++ に関連付けられている機能ですが、unsafeコード ブロック内の C# コードで使用できます。構文を理解するだけでは効果的に使用するには不十分であるため、概念について一般的な調査を行うことをお勧めします。数行説明します。

 int * p; //a pointer (the address of) 4 bytes of memory for an int
 int a = 5; // normal allocation/initialization of int
 p = &a; //sets p  to the address of a. Since p is a pointer, it holds an address
 // ampersand is the 'address of operator', it returns and address. so this assignment works


 p = a // will not compile. int* != int

 p == 5 // will not compile, int* != int

 *p == 5 // true. *pointer dereferences the pointer returning the value
 // found at the address p points to which is 5 so this is true.

 int * q = &a; // another pointer to the memory containing a

 p == q // true, both pointers contain the same value, some address which is usually displayed in hex like 0xFF110AB2

ポインターのより一般的な使用法は次のようなものです。

int *p;
// do something to get a length for an integer array at runtime
p = new int[size]; 
// now I've allocated an array based on information found at run time!

上記の操作は C/C++ では非常に一般的であり、完全に必要です。C# では、これを行う意味はありません。これはすでに裏で行われており、間違いを犯すことはありません (割り当てたばかりのメモリを解放できないなど)。

于 2012-12-12T00:48:23.300 に答える
1

int* ppint へのポインターであるという名前の変数を宣言します。

p = &ap、メモリ内の と同じ場所を指しますa

この種のことを理解する必要がある場合は、ポインター型 (C# プログラミング ガイド)から始めるとよいでしょう。

于 2012-12-12T00:46:39.770 に答える
1

コードでは、C# を使用するとunsafe、C などのポインターとアドレスを使用できます。 int *pへのポインターを宣言しますintp = &a、 のアドレスを取得し、aに格納しpます。

fixedガベージ コレクターがデータを移動するのを防ぎます。

http://msdn.microsoft.com/en-us/library/chfa2zb8(v=vs.100).aspxおよびhttp://msdn.microsoft.com/en-us/library/f58wzh21(v=vs . 100).aspx

于 2012-12-12T00:48:15.080 に答える
1

このコードでは、いくつかの構文について混乱しています。例えば...

私は一度にこれらの1つに対処しようとします(しゃれは意図されていません)

int* p とは

これは、型が int へのポインターである「p」という名前のローカル変数を宣言します。したがって、この変数がメモリ アドレスに割り当てられると、int32 であるかのように 4 バイトが読み取られます。

...そして p = &a

右側の「&a」は「a のアドレス」として読み取られます。これは、ローカル変数「a」に割り当てたメモリ位置を取得することを意味します。これを既に宣言されている int ポインター 'p' に割り当てると、'p' を読み取って変数 'a' に実際に格納されている値を取得できます。

最後の固定部分 (int* r = ia) は何をするのでしょうか?

これは、"the address of" プレフィックスがないことを除いて、a のアドレスへの p の割り当てに非常に似ています。これは、変数 'ia' の型が配列であり、ポインターであるかのように暗黙的に扱われているためです。したがって、このステートメントは int ポインター 'r' を宣言し、それを配列 'ia' の最初の項目のアドレスに割り当てます。

さらにいくつかの注意事項があります。

if (*p == 2) ...

'*' で始まるポインターは、そのポインターを逆参照し、ポインター型の変数であるかのように扱われます。したがって、この例では、変数「a」を指す「p」を逆参照すると、「a」に格納されている値が 2 になります。

*p = 100;

「p」が指すアドレスの値を読み取るのと同じように、新しい値を書き込むこともできます。ポインタを逆参照して、新しい値を割り当てるだけです。

*&a

これは、誰かを混乱させることを意図したものです。説明したように、「&」をプレフィックスとして「a」のアドレスを取得しますが、「*」プレフィックスを使用してアドレスを逆参照します。これは単純に「a」と評価され、両方のプレフィックスを省略しても動作は変わりません。

于 2012-12-12T01:02:18.463 に答える