投稿

8月, 2012の投稿を表示しています

const char *argv[]

iOSプログラミングでmain関数ってあまりじっくり見る機会がないんだけどよく見ると const char *argv[] っていう引数が結構難解。 文法通りの結果になるような私なりの解釈を書いてみる。これは人によって違いがあると思う。 まずchar *argv[]の解釈だが、そのまえにポインタと配列の宣言の分析をする。 int *abc; これは、*をつけてアクセスしたものはint型(つまりintへのポインタ)で、名前はabcというものを宣言。 int abc[]; これは各要素はintである配列で、名前はabcというものを宣言。 これをふまえてchar *argv[]を考えると *よりも[]のほうが優先順位が高いのでこの順番で解釈し、 ある配列がある。その各要素は*をつけてアクセスするとcharになるもで、その名前(配列の名前)はargv。と解釈し、argv[]はchar型へのポインタの配列で、argvと配列名だけで使用するとその先頭要素を指す。配列の要素のargv[0]はchar型へのポインタ。 また優先順位を意図的に変えたchar (*argv)[]だと、こちらのページが詳しく書いてある。 今こそ再考察! C言語ポインタ徹底解説 「配列へのポインタ」と「2次元配列(配列の配列)」の関係 http://news.mynavi.jp/articles/2008/04/18/pointer/003.html 4ページあるうちの4ページ目です。1ページ目から内容が良いので読むことをおすすめします。 この(*argv)の部分だが「配列の名前が先頭要素へのポインタだから、さらにそれを指すポインタ」と解釈したら間違いらしい。argvはポインタだが指す先は配列の先頭要素。だとすると、*をつけたときとつけないときで何が違うか、というのを疑問に思うが、それも上のページに詳しく書いてある。*をつけるとポインタ加算命令に対して配列ひとつ分進むらしい。なので宣言時に配列の要素数は必須。上のchar (*argv)[]はXcodeのコンパイラだとポインタ演算のところでエラー。 ちなみに配列の名前はポインタと近いが微妙な違いがある。 char *argv[]の間違った解釈としては char型の配列があってその先頭要素を指すポインタをさらに指