- ベストアンサー
ポインタ配列の値引き渡しについて
関数を作る際 func(int p[][]) →コンパイルエラー func(int *p[]) →コンパイルOK になるのは何故ですか? 同じことを言っているように思うのですが?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「ポインタは特に指示しなくても、大きさが確定する」でだいたい当たり. まず, C において配列には「1次元配列」しか存在しません. で, 配列の要素には非常に大雑把にいうと「宣言の時点で大きさが確定しなければならない」という条件が付きます (正確な条件はめんどくさいので省略). ということで ・int p[][]: p の要素は「int []」であるが, この [] の中に大きさが書かれていない→要素の大きさが確定しないのでアウト ・int *p[]: p の要素は「int *」で, 大きさが確定しているのでセーフ ・int p[][4]: p の要素は「int [4]」. これは大きさが確定するのでセーフ ついでに余談: 関数の仮引数に配列を書くと自動的にポインタと解釈される.
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
残念ながらこの 2つは「同じことを言っている」わけではないので.... func(int p[][]) と同じことになるのは func(int (*p)[]) だったりする (そしてもちろん同様にエラーになる).
質問者
お礼
func(int p[][4]) →コンパイルOK func(int *p[]) →コンパイルOK この違いはなんでしょうか? *p[]=p[][4]でもなさそうですし?ポインタは特に指示しなくても、大きさが確定するからでしょうか?
質問者
補足
すいません、お礼を言うのを忘れていました。 早速のご返信ありがとうございます。 なにとぞ、↓の質問も答えていただきますよう、お願い申し上げます。
お礼
分かりやすいご説明ありがとうございます。 物凄くよくわかりました。 今後ともよろしくお願いします。