4年前2次元配列のアドレスの表現法について質問です。2次元配列dの先頭アドレスを求める式には実は5つあり【d】【&d[0]】【d[0]】【*d】【&d[0][0]】が該当すると聞いたのですが,なぜこれで表せるかわからないです。教えて頂けると幸いです。私は以下のような理由で表現できるのではないかと思います。配列名は配列の先頭の要素のアドレスになる。dは配列の配列であるため、先頭の配列のアドレスを指す。先頭の配列のアドレスは先頭の配列の先頭の要素のアドレスなのでdは先頭アドレスになる。&d[0]は先頭の配列のアドレスなので先頭アドレスになる。d[0]は先頭の配列の名前と考えられ、その先頭の要素のアドレスを指すので先頭アドレスになる。*d=*(&d[0])=d[0]なので先頭アドレスになる。&d[0][0]は先頭の配列の先頭の要素のアドレスなので先頭アドレスになる。4年前まず,基本事項として,配列型のオブジェクトが式中にでてきた場合,いくつかの演算子の対象になる場合(sizeofやtypeid,単項&など)を除いて,配列型のオブジェクトはその先頭要素へのポインタに変換されます。aが配列型のオブジェクトについた識別子の場合,ソースコード中のaと&a[0]は上記の例外を除くと同じ意味です。その上で,二次元配列,つまり配列の配列型のオブジェクトに関して,次のような関係になります。型を無視して式中での値が同じであっても,意味が異なるので,配列型オブジェクトとポインタや要素の関係は一度整理した方がよいと思います。個人的には「アドレス」という言葉は,意味の中に型を含まないことが多いため,使わないことを推奨します。オフトピックちなみに,*dはdが&d[0]になるので,*&d[0],つまりd[0]と同じ意味になります。d[0]は上記にあるとおり,&d[0][0]に変換されます。よって,*dは&d[0][0]と同じ意味になります。typeid演算子の対象にした場合。配列型は配列型のまま扱われる。0;}なんてコードを実行してみると,その式自体の型と,その式が式中ででてきた場合の型がわかるかと思います。オフトピックgccのstd::typeinfo::nameはVC++ほど直接的な出力をしてくれないので,VC++で,と書いています。*dはdが&d[0]というのがいまいちよく理解できません。添字演算子[]の定義から考えるとdと*(d+i)は同じです。i=0の場合を考えてd[0]と*dは同じです。d[0]と*dの両方に&演算子をつけて&d[0]と&(*d)は同じです。&(*d)はdと同じですから&d[0]とdは同じです。ミクプラは自由にリンクできます。