1

重複の可能性:
配列のアドレスが C の値と等しいのはなぜですか?

状況では:

int x = 5;
unsigned char myArray[sizeof (int)];

この線...

memcpy (&myArray , &x , sizeof (int));

... と同じ結果が得られます:

memcpy (myArray , &x , sizeof (int));

私は C++ の初心者ですが、配列はデータへのポインタに過ぎないという印象を受けました。&myArray が myArray と同じように動作していたときはショックを受けました。ポインターの ADDRESS にコピーしようとしていると思っていたでしょうが、これは非常に悪いことです!

4

3 に答える 3

4

配列に関する2つのこと:

  • 配列は、要素タイプのポインターに「減衰」します。これが、2番目のバージョンが機能している理由です。これを参照してください:配列名はポインタですか?

  • 「配列へのポインタ」などがあります。それらはめったに使用されませんが、次のようになります。


int a[5];
int (*b)[5] = &a; // pointer to an array of 5 ints

&演算子を配列で使用すると、配列型へのポインターが得られます。そのため、以下は機能しません。

int* b = &a; // error

memcpyのパラメータはでありvoid*、任意のポインタタイプを受け入れるため、との両方が機能&myArraymyArrayます。myArray慣用句が多いので、一緒に行くことをお勧めします。

于 2013-02-01T03:45:26.623 に答える
1

あなたはタイプが異なると信じているのは正しいです。&myArrayunsigned char(*)[](unsigned charの配列へのポインタ)であり、myArray(引数として関数に渡されると)type unsigned char*(unsigned charへのポインタ)になります。ただし、タイプが異なっていても、値は同じアドレスであることに注意してください。両方がmemcpyで機能する理由はmemcpyvoid*タイプを取得し、気にしないためです。

于 2013-02-01T03:44:58.023 に答える
1

myArrayと&myArrayの違いは何ですか?

どちらもmyArrayの最初の要素を指しています。

配列の名前は通常、配列の最初の要素のアドレスに評価されるため、myArrayと&myArrayの値は同じです。

memcpy関数は、入力引数として宛先へのメモリアドレスを取得します。myArrayと&myArrayは同じ場所を指しているため、作業は同じです。

void* memcpy( void* dest, const void* src, std::size_t count );

Parameters
dest   -     pointer to the memory location to copy to
src    -     pointer to the memory location to copy from
count  -     number of bytes to copy
于 2013-02-01T03:45:45.417 に答える