質問: atoi(++*argv); } } ``` この**(++argv)と*++(*argv)と++*argvがそれぞれ何を指しているのかわかりません。
回答: インクリメントが絡んでいるので処理を追って説明します. 例として,`argv = {"program", "-t10", "-t26"}`とでもしましょう. ### `**(++argv)` `while`文中最初の`**(++argv)`ですが,基本的に`argv`の第一要素`"program"`はプログラム名なので,プログラム名に続いて与えられるであろうオプションを受け取るために,`argv`の2番目の要素`"-t10"`からチェックします.これが`++argv`の役割. で,`argv`の2番目の要素が`'-'`で始まっていることを確認するため,文字列の配列である`argv`から具体的な文字列`*argv`を取得し,先頭の文字`**argv`が`'-'`であることをチェックしています. 以上2つを同時に行うのが,`if(**(++argv) == '-')`の部分で,具体的に言えば`++argv`で`argv = {"-t10", "-t26"}`となるので,`**(++argv) = '-'`となります. ``` **(++argv) => **(++({"program", "-t10", "-t26"})) => **({"-t10", "-t26"}) => *("-t10") => '-' ``` ### `*++(*argv)` 上記の操作で既に`argv`はインクリメントされているので,これ以降`argv = {"-t10", "-t26"}`となっていますので,`*argv = "-t10"`です. 以降の説明のため一時変数`char* tmp = *argv`を置きましょう. こうすると,`tmp = *argv = "-t10"`なので,`++tmp = "t10"`となって,`*++tmp = 't'`となります. よって,`*++(*argv) = 't'`です. ``` *++(*argv) => *++(*({"-t10", "-t26"})) => *++("-t10") => *("t10") => 't' ``` ### `++*argv` さて,先ほどの段で,`tmp = *argv`と置きました. これを定義した時,`tmp = *argv = "-t10"`でしたが,その後`tmp`は一度インクリメントされたので,現在は`tmp = "t10"`となっているはずです. ここでは,これをさらにインクリメントしているので,`++tmp = ++*argv = "10"`となります. これを`atoi`に投げることで,`width = 10`が取得できます. ``` ++*argv => ++(tmp) => ++("t10") => "10" ``` ### その後 次のループでは,再び`argv`のインクリメントからスタートするので,各部分では ``` **(++argv) => **(++({"t10", "-t26"})) => **({"-t26"}) => *("-t26") => '-' *++(*argv) => *++("-t26") => *("t26") => 't' ++*argv => ++("t26") => "26" ```