dポイントプレゼントキャンペーン実施中!

C言語のint (*)[5]型と参照についてです。
自分なりにまとめてみましたがこういう考え方で合っているでしょうか?

「型Tの配列」は「型Tへのポインタ」に常に置き換えられることと、シンタックスシュガーを条件に
int a[3][5];
int (*p)[5];
p=a;があるとする。

pはint(*)[5]型は、int型要素数5の配列へのポインタでありa[0]のアドレスが格納されている。
*pで、中身はint型要素数5の配列。ここで配列をポインタに置き換えてint型要素数5へのポインタとなる。a[ i ]と[ j ]のシンタックスシュガーを考慮し、*(p+i)+jにもう一つ間接参照演算子を適用して*(*(p+i)+j)となりint型の要素を参照できる。

それを利用してfor(i = 0;i < 15;i++){ を使って配列の要素を全て表示する場合、2次元配列が配列の配列だということをふまえると、pをインクリメントせず*((*p)+i)とすることもできる。

質問者からの補足コメント

  • 回答ありがとうございます。

    https://detail.chiebukuro.yahoo.co.jp/qa/questio …

    知恵袋の回答者さんたちが、int型n要素の配列へのポインタと書かれているのですが、自分の解釈の仕方が間違えているのでしょうか?

    自分の中でのポインタ型の配列はint *a[5];の表記だと思っていたのですが…
    そのほかにも間違えていそうなところがあればよろしくお願いします。

      補足日時:2018/12/28 18:19

A 回答 (4件)

あ, 「少なくともこの質問文において「インクリメント」はどこにも存在しない」は間違ってた.


for(i = 0;i < 15;i++)
で i をインクリメントしてるわ.

まあ p はどこでもインクリメントしてないけど.

そういえば「シンタックスシュガーを条件に」はなにに関係するんだっけ?
    • good
    • 0

いちおう指摘しておくと


「型Tの配列」は「型Tへのポインタ」に常に置き換えられる
わけではないです (ポインタに変換されない状況も存在する).

そこ以外は OK... いや, 「pをインクリメントせず」のところはおかしいな. 少なくともこの質問文において「インクリメント」はどこにも存在しない.
    • good
    • 0

>int型n要素の配列へのポインタと書かれているのですが


あら、本当だ
じゃあごめんなさい私の勘違いだと思います
    • good
    • 0

>pはint(*)[5]型は、int型要素数5の配列へのポインタであり


根本的にここが間違っています
int (*p)[5];
これはintのポインタ型の配列です
配列のポインタ型ではなく
ポインタ型の配列です
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!