お世話になります
添字演算子について
以下教えて頂けますでしょうか
■質問
下記コードでp[2][1]とすればintの6が得られるのですが
この結果を得られるまでの流れを詳細に教えて頂けますか
出来ましたら私の思考過程に突っ込みを入れながら。。。
■自分の思考過程
まず、p[2][1]は(p[2])[1]と考えて
p[2]は何を示すのだろうと考えました
pはint2個分の要素を指すポインタで
aで初期化されている
このため、p[2]はaの先頭から要素2つ
つまりint4つ分進んだ先にあるモノを示すはずなので
a[2]のアドレスこれは&a[2][0]と同じものを指す
ここまででp[2][1]は
(&a[1][0])[1]と同じなのではと推測
ですが、ここから先が進めません
p[1]を求めるにはpの参照先の型がint2つ分という情報が宣言の文にあるので
aの先頭からint4つ分進められたのですが、次はありません
仮に(&a[1][0])が具体的なアドレスを返してきたとしても
そこから[1]をどう解決していいかわからないと思うのです。
こういう動きを具体的に捉えるには
コンパイラとかリンカがどう動いているか追及しないといけないのでしょうかね。。。
■私が理解していること(正しいかどうかは)
・ポインタ変数は「参照先の型」と「アドレス」を保持している
・ポインタを1進めると「参照先の型」のサイズ分「アドレス」が増える
・ptr[i]は*(ptr+i)のシンタックスシュガーである
・ptr[i]はptrが指しているアドレスから
i要素後ろの位置にあるアドレスに格納されているモノを示す
・3次元の配列aにおいてa、a[0]、a[0][0]、&a[0][0][0]は
いずれも評価すると配列の先頭アドレスを得られる
■コード
#include <stdio.h>
int main() {
int a[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
int (*p)[2] = a;
printf("\n%d", p[2][1]); printf("\n%d", (p[2])[1]); return 0;
}

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/16 13:48
2016/06/16 14:59
2016/06/17 10:48 編集
2016/06/19 08:40