4

私はそれint (*p)[5]が5つのintの配列を指すポインタを意味することを知っています。したがって、このプログラムを以下にコーディングします。

#include <iostream>
using namespace std;

int main()
{
  int a[5]={0,1,2,3,4};
  int (*q)[5]=&a;
  cout<<a<<endl;         
  cout<<q<<endl;
  cout<<*q<<endl;        
  cout<<**q<<endl;
  return 0;
}

私のマシンでは、結果は次のとおりです。

0xbfad3608
0xbfad3608       //?__?
0xbfad3608
0

*qのアドレス a[0]**qの値を意味することは理解できますa[0]が、なぜと とq同じ値になるのでしょうか。私の貧弱な考えでは、それは彼らの住所であるべきです!私は完全に混乱しています。誰か助けてください。お願いします!a*q

4

3 に答える 3

8

このように見てください:

   q == &a
   *q == a
   **q == *a

印刷しようとしませんでした&a。すると、 と同じ値であることがわかりますa。、&a == aおよびq == &a、および*q == a、推移性によるq == *q

理由を知りたい場合は、配列変数のアドレスがそれ自体と同じである&a == a理由を確認してください。

于 2011-11-30T08:16:48.520 に答える
2

qおよび&a配列へのポインタです。

*qそしてa「配列」です。しかし、実際には配列を関数に渡すことはできません (そしてそれstd::ostream::operator<<は関数です)。実際には、暗黙的に作成された最初の要素へのポインターを渡します (ポインター減衰と呼ばれます)。したがって*qa配列の最初の要素へのポインターになります。

配列の先頭は、メモリ内の配列と同じ場所にあります。関連するポインターはいずれも char へのポインター (文字列リテラルが期待どおりに機能するように特別に処理される) ではないため、アドレスはそのまま出力されます。

于 2011-11-30T09:13:49.233 に答える
1

これは、 のアドレスの値を持つだけの にarray自動的に変換されるためです。したがって、またはを使用して印刷しようとすると、実際にはそのアドレスが印刷されます。pointerarrayarray<<a<<*q

于 2011-11-30T08:18:56.093 に答える