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型の配列があってその先頭要素を指すポインタをさらに指したポインタがargv。
という解釈がある。初めは私もそう考えてしまって、正しい説明が理解できずにかなり迷った。

constはcharにかかってます。

コメント

このブログの人気の投稿

Swiftのコンパイルエラー寄せ集め

Swift2.2からSwift3.0への変換を行ってみて

AVAudioSession細かいことまとめ(late 2014)