こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

この(C言語)ダブルポインタのアルゴリズムを教えて!

main(int argc, char *argv[])
while(--argc > 0) {
if(**(++agv) == '-') {
switch(argv[0][1]){
case 'a';
オプションaに対する処理;
break;
case 'b';
オプションbに対する処理;
break;
case 'c';
オプションcに対する処理;
break;
default;;
abc 以外のオプションが入力された時の処理;
}
} else
break;
}

オプション以外のパラメータが入力されたときの処理;


特に ’**’の部分や argv[0][1]の意味が解かりません。
よろしくお願い致します。

投稿日時 - 2010-04-16 22:25:43

QNo.5830974

すぐに回答ほしいです

質問者が選んだベストアンサー

ポインタに*を付けたら、そのポインタが示す先のものになるのは、おわかりですか?(ポインタ操作の基本です)
ポインタPが示す先がポインタなら、 *pはポインタになります。
**pは *(*p)、つまり ポインタ*pの示す先、ということになります。

また、 *p = p[0] , *(p+1) = p[1] という、ポインタは1次元配列のようになるのもおわかりですね?(これもポインタ操作の基本)
同様に、**p → *(p[0]) → p[0][0] となります。
あるいは **p → (*p)[0] → p[0][0] となります。
ポインタへのポインタは二次元配列のように扱えます。

> main(int argc, char *argv[])
のように書くと、コマンドライン引数に関する情報がargc,argvに入ります。
第1引数argcは引数の数です。コマンドだけなら1、引数が一つ付くと2,以下3,4,..となります。

第2引数argvは 引数の文字列の列です。
argv[0] に実行ファイルそのものを表す文字列
argv[1] に最初の引数、以下argv[2]...と続きます。
また、文字列なので、charの配列として扱えます。
argv[0][0]は コマンドの最初の文字になります。

> if(**(++argv) == '-') {
ここでは、まず、argvを一つ増やします。それにより、いままでargv[0]を指していたポインタ変数argvが、元のargv[1]つまり第1引数の文字列を指すようになります。
そこで、**argv →argv[0][0]です。文字列argv[0]の1文字目です。元のargv[1]つまり第1引数の文字列の1文字目です。

>switch(argv[0][1]){
上と同様に、文字列argv[0]の2文字目です。元のargv[1]つまり第1引数の文字列の2文字目です。

これをargc回ずらしてループします。

投稿日時 - 2010-04-16 23:44:44

お礼

すごく丁寧な解答を、ありがとうございます。
勉強になりました。

投稿日時 - 2010-04-17 09:21:29

ANo.3

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

みなさんからの回答をもとに図化してみると、
理解度が増すかもしれません。

投稿日時 - 2010-04-17 09:05:20

お礼

御指導ありがとうございます。
勉強になります。

投稿日時 - 2010-04-17 09:22:49

まず **(++argv) ですが、文字列配列 argv が現在指している位置の次の文字列の先頭文字をポイントします。実際には、複数あるコマンドラインオプションの先頭が '-' であるかどうかを調べる if 文です。

次に argv[0][1] ですが、配列 argv の現在指している位置の先頭から2番目の文字をポイントします。実際には、コマンドラインオプションの '-' の次の文字をポイントしています。

投稿日時 - 2010-04-16 23:27:45

お礼

アルゴリズムまで説明していただき、ありがとうございます。
誠にありがとうございました。

投稿日時 - 2010-04-17 09:17:40

ANo.1

main関数の引数のargvは
char *argv[]
と宣言されています。

これは、argvはchar *、すなわちchar型へのポインタの配列ということです。
また、配列の名前だけ取り出したものは、配列の先頭へのポインタとなるので、argvは「char型へのポインタ」へのポインタとして働きます。

したがって *argvは「char型へのポインタ」を示し、**argvはその「char型へのポインタ」が指すchar型のデータを指すことになります。

同様に、ポインタは配列の先頭として働くので、argv[n]のように添字を付けることで配列のようにデータを扱えます。
したがって、argv[m][n]は、m番目の「char型へのポインタ」の指す領域のn番目のchar型データということになります。

ここではargvはコマンドライン文字列を指してるので、実際にはmは0以外の値にはならないはずですが、これと同じような形で2次元配列を表すことが出来ます。
argv[0][n]は、(*argv)[n]と同義です。

投稿日時 - 2010-04-16 23:19:37

お礼

ポインタと配列の関係について、ありがとうございます。
丁寧な御教授ありがとうございました。

投稿日時 - 2010-04-17 09:15:48

あなたにオススメの質問