小野@名古屋大学 です.

<bqgtse$bas$1@news511.nifty.com>の記事において
kounoike@mbh.nifty.comさんは書きました。
kounoike> K&RのP136にも,”二次元配列を関数に渡す場合は,
kounoike> 関数の引数宣言には列の数がなければならない。”とはっき
kounoike> り書かれているので,最後のchar argv[][] は駄目と私も上
kounoike> を見たとき疑問も無く納得してましたが,OKのようですね。
え? OK ってどういう意味ですか?

Java じゃないので, ちゃんとエラーになるはずですが.
# C# でもいいんだっけ?

main の宣言として ISO C で規定されているのは
int main(void)
と
int main(int argc, char **argv)
の 2つだけです (char **env を追加できる処理系もあり). ここで
char **argv と char *argv[] が実は互換なので
int main(int argc, char *argv[])
とも書けるというだけの話ですよね.
# で, char *argv[] と char argv[][] は (コンパイルエラーになる点
# を差し引いても) 互換じゃない.

kounoike> ということは,char argv[][] は二次元配列のように見える
kounoike> が,単なるポインタのポインタのということで,配列ではな
kounoike> いということになるのかな。これまた錯覚の一種?。
宣言において, 「配列」と「ポインタ」は別ものです. これが原則.

但し, 関数の仮引数リストにおいては (配列を関数に渡すときにポイン
タに変換されるため) 配列の形式で書いてもポインタとして解釈されま
す.
-- 
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男