Re: Array and pointer
小野@名古屋大学 です.
<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> いということになるのかな。これまた錯覚の一種?。
宣言において, 「配列」と「ポインタ」は別ものです. これが原則.
但し, 関数の仮引数リストにおいては (配列を関数に渡すときにポイン
タに変換されるため) 配列の形式で書いてもポインタとして解釈されま
す.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735