• ベストアンサー

ポインタ配列の値引き渡しについて

関数を作る際 func(int p[][]) →コンパイルエラー func(int *p[]) →コンパイルOK になるのは何故ですか? 同じことを言っているように思うのですが?

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「ポインタは特に指示しなくても、大きさが確定する」でだいたい当たり. まず, C において配列には「1次元配列」しか存在しません. で, 配列の要素には非常に大雑把にいうと「宣言の時点で大きさが確定しなければならない」という条件が付きます (正確な条件はめんどくさいので省略). ということで ・int p[][]: p の要素は「int []」であるが, この [] の中に大きさが書かれていない→要素の大きさが確定しないのでアウト ・int *p[]: p の要素は「int *」で, 大きさが確定しているのでセーフ ・int p[][4]: p の要素は「int [4]」. これは大きさが確定するのでセーフ ついでに余談: 関数の仮引数に配列を書くと自動的にポインタと解釈される.

NEW2010
質問者

お礼

分かりやすいご説明ありがとうございます。 物凄くよくわかりました。 今後ともよろしくお願いします。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

残念ながらこの 2つは「同じことを言っている」わけではないので.... func(int p[][]) と同じことになるのは func(int (*p)[]) だったりする (そしてもちろん同様にエラーになる).

NEW2010
質問者

お礼

func(int p[][4]) →コンパイルOK func(int *p[]) →コンパイルOK この違いはなんでしょうか? *p[]=p[][4]でもなさそうですし?ポインタは特に指示しなくても、大きさが確定するからでしょうか?

NEW2010
質問者

補足

すいません、お礼を言うのを忘れていました。 早速のご返信ありがとうございます。 なにとぞ、↓の質問も答えていただきますよう、お願い申し上げます。

関連するQ&A