• 締切済み

main(int argc,char **argv[])の意味を教えて下さい

 今晩は、Cの初心者です宜しくお願いします。  main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 また、必ずポインタ型でとるという決まりでしょうか。 宜しくお願いします。

みんなの回答

noname#96502
noname#96502
回答No.4

mtake2さんの言われている事に同意します。 >int main(int argc, char **argv) >int main(int argc, char *argv[]) >この二つは、文法上は違いはありません。 ですが、本題は下記の違いですよね。 int main(int argc, char *argv[]) int main(int argc, char **argv[]) >この内容に、**argv[]、*argv[]の違いのヒントが有るのでしょうか。 ヒントはstrcpy(buf,argv[0]);です。 main関数の宣言を**argv[]と*argv[]で切り替えることでコンパイルエラーの内容や実際の動作に変化はないですか? (コンパイル時にエラー内容、警告内容を理解するのは必須ですよ) >#これは、bufのアドレスのあるメモリサイズの大きさが、4と出てると考えていますが??? i = sizeof(buf); これが10と出力されている事に注目してください。 よく配列を宣言して、その配列を別関数に参照渡し(ポインタで渡す)する場合に下記のコードを書きますが、bufがポインタなら10と出力された事に疑問を持ちませんか? void test(char *b); int main(void) { char buf[10]="aaa"; test(buf);//この引数のbufはbuf[10]へのポインタではないのか?ポインタならsizeof(buf)の大きさは4byteではないのか?(これが説明できれば理解できています。) printf("%s",buf);//参照渡し(ポインタでの引き回し)をしているので出力されている値はbbbとなっている。 return 0; } void test(char *b) { strcpy(b,"bbb"); } 質問者さんへ) 違いを理解するなら、まずは自分でプログラムを組んで、それを動かしてみて、実際に動作を確認して動きを理解することが大切です。 もしデバッグ環境がないのなら、コンソールに出力するなど工夫する事もまたプログラミングの勉強になります。 一度にたくさん理解しようとしないで、1個ずつ理解してください。

htgo
質問者

お礼

bravheartさん、回答有り難う御座います。 >bufがポインタなら10と出力された事に疑問を持ちませんか? #bufがchar型の配列で要素数が10なら全体のサイズは「1byte*10要素」で10となるのは理解出来るのですが??? 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.3

変数宣言においては、ポインタと配列は全然別のものですが、 関数の引数では、配列はポインタとして扱われることになっています。そのため、   int main(int argc, char **argv)   int main(int argc, char *argv[]) この二つは、文法上は違いはありません。 意味はまったく同じですので、どちらで書いても同じ動作をします。 どちらで書くかは好みの問題です。 それぞれの言い分は **argv派: 関数の引数に「配列」なんてものはないので、全部ポインタとして書く *argv[]派: char*の配列=「文字列の配列」であるという設計の意図が分かりやすい といったところでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
noname#96502
noname#96502
回答No.2

遅くまでお疲れ様。 >「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。 違いは文法通りですよ。 main関数に渡される引数をポインタで受け取るか、ポインタのポインタで受け取るかの違いです。 下記のプログラムをデバッグして動きを見てください。(main関数に渡す引数は2個を想定してます。) void main(int argc,char **argv[]) { char buf[10]=""; printf("%d\n",argc); printf("%s\n",argv[0]);//**argv[]の時になぜ正常に動作するかと言うと、printfがポインタのポインタでも動くように賢く作られてるからかな。。。動くがどうかは開発環境に依存するかも知れませんが、あんまり意識しないでください。 printf("%s\n",argv[1]); printf("%s\n",argv[2]); strcpy(buf,argv[0]);//コンパイルエラーになるが**argv[]→*argv[]に変えると正常に動作する } 次になぜポインタのポインタで受け取るかと言う事ですが、Cを書く人のスタイルの差ですw 私は基本的にポインタのポインタは使わないように仕様を決めるので、使用経験が少ないので偉そうに説明するのは辞めときます。(でもコードは理解できますよ) 初心者と自分で言われているので、まずはC言語の最大の難関であるポインタを正しく理解してください。 ちなみにchar buf[10];と宣言したときのbufは特殊な動きをするポインタなので普通のポインタが理解できてから色々プログラムを組んで勉強してください。 ヒントは下記のプログラムです。(iに代入される値に注目) char buf[10]; char *a=buf; int i=0; i=sizeof(buf); i=sizeof(a); ポインタのポインタはその次ですね。

htgo
質問者

お礼

bravheartさん、回答有り難う御座います。 早速下のコードで確認して 1 D:\eclipse\workspace\\Pointer\Debug\Pointer.exe (null) D の結果になりましたが、printf("%d\n",argc)、printf("%s\n",argv[0])~("%s\n",argv[2])の内容が出力されているだけで、 この意味がさっぱり分かりません。 この内容に、**argv[]、*argv[]の違いのヒントが有るのでしょうか。 **argv[]、*argv[]の内容は変わらなかったのですが。。。 strcpy(buf,argv[0]);の後にprintf("%s\n",argv[0]);としても何も出力されなかったのですが、警告は出ていましたが??? ========================================================== void main(int argc,char **argv[]) { char buf[10]=""; printf("%d\n",argc); printf("%s\n",argv[0]); printf("%s\n",argv[1]); printf("%s\n",argv[2]); strcpy(buf,argv[0]); } 1 D:\eclipse\workspace\\Pointer\Debug\Pointer.exe (null) D ====================================== int main() { char buf[10] ; char *a=buf ; int i = 0 ; i = sizeof(buf); printf("%d\n",i); i = sizeof(a); printf("%d\n",i); return 0; } 10 4 ======================================================= >(iに代入される値に注目)  #これは、bufのアドレスのあるメモリサイズの大きさが、4と出てると考えていますが??? これが**argv[]とどのように繋がっていくのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

へ? 「int main(int argc,char **argv[]) と書かれている場合」というのは, 例えばどこにあるのでしょうか? int main(int argc,char **argv) ならわかるけど....

htgo
質問者

お礼

Tacosanさん、回答有り難う御座います。 >int main(int argc,char **argv) ならわかるけど.... int main(int argc,char **argv) でした、すみません、どのような意味でしょうか。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • int main(int argc, char* argv[]) についての質問

    こんにちは.つね日ごろ思っている質問させてください. Cの参考書には, (1) void main(void) { } (2) int main(int argc, char* argv[]) { return 0; } の2つのパターンが記載されていますが, どういう違いがあるのでしょうか? (1)の場合main関数は,型を持たず,引数も持たない. ※Turbo Cなどのコンパイラーでは, return文がないと警告出ます. (2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?) を指定している. といったくらいしか分かりません. (2)に関してもう少し述べれば, コマンドラインからファイルを指定し,実行することが できると勉強した記憶があるのですが, 理解があいまいです. 特に(2)の場合のmain関数の意味と,その使い方について アドバイスお願い致します.

  • main関数のとる引数(argc , *argv[])の意味について

     今日は、Cの初心者です宜しくお願いします。    main関数(main(int argc , *argv[]))のとる引数、argcのCと*argv[]のVはどのような意味の略なのでしょうか、 なにか意味があるようなきがするのですが。  宜しくお願いします。

  • コマンドライン引数 *argv[]はなぜポインタ?

    C言語初心者です。 コマンドライン引数、 int main(int argc, char *argv[]) というのを最近勉強しましたが、引数2番目がポインタになっている理由について、 どなたか教えて下さい。 そういう仕様なんだから、それに従いましょう、ということでしょうか? int main(int argc, char argv[]) では、ダメなのでしょうか? このポインタでの引数渡しについて、 なんらかの納得のいく考え方をご存知の方がいらしたら、教えて下さい。 宜しくお願い致します。

  • main の引数には const 付けた方が

    C言語での質問です。 引数を取るような main 関数は int main( int argc, char *argv[]){~} とされていますが、argvの指す文字列を変更する、というのはいくら何でもまずいので、 int main( int argc, const char *argv[]){~} あるいは int main( int argc, const char const * const * argv){~} の方がいいのではないでしょうか? 何故、constを付けない形が出回っているのでしょうか?

  • main関数について

    最近C言語を勉強し始めた者です。 main関数について分からないことがあるので質問致します。main関数は自作関数ですよね。ということは自由に引数を決めていいのですか?つまり int main(int argc , char *argv[]) 以外の引数を決めることは出来るのでしょうか。

  • 引数の渡し方と受け方(argv)

    メインで引数をもらい、それをパラメタチェック関数に 渡す場合、どのような形で渡せばいいですか? ※メインでargvを変数に格納しないで、 そのままargvを関数に渡す方法が分かりません。 int prm_chk(char *argv[]) { /* 処理省略 */ } int main (int argc, char *argv[]) { /* 処理省略 */ /* 以下のパラメタ(argv)の渡し方 */ if(prm_chk(*argv[]) != 0){ exit(-1); } exit(0); }

  • main( )

    次の様なプログラムを作りました。 Dosプロンプトを開き、コンパイルで出来た、exeファイルのアドレスを渡しました。 例えば、2と3を引数として渡す時、 2 スペースを押す、 3 enter  の順に行うと、エラーになります。 どの様に、引数を渡すのか操作方法を教えてください。 お願いします。 #include<stdlib.h> #include<stdio.h> int main(int argc, char *argv[]) {    if(argc!=3){     printf("2つの数を指定してください。");     exit(1);    }     printf("%f",atoi(argv[1])+atoi(argv[2]));    return 0; }

  • objective-c main関数について

    私はobjective-cを用いてiPhone用アプリケーションを自主的に開発していますが、main.mのmain関数の中身がいまいち分かりません。 もししっかり分かる方が居ましたら教えていただけるとうれしいです。 私はプログラミング歴半年とちょっとのほぼ初心者です。 以下がソースコードです int main(int argc, char *argv[]) { NSAutoreleasePool * pool

  • main関数の事についてお聞きします。

    Windowsのプログラムを書くとき、下のようにキッチリ戻り値や引数を書かなくてはならないのに int WINAPI WinMain( HINSTANCE hInstance, // 現在のインスタンスのハンドル HINSTANCE hPrevInstance, // 以前のインスタンスのハンドル LPSTR lpCmdLine, // コマンドライン int nCmdShow // 表示状態 ); C言語で書かれたプログラムは int main(int argc, char *argv[]) ではなく、 int main(void) や void main(void) または int main() や main() だけのモノなど、 いろいろです。 main関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

  • Cocoa をコマンドラインから実行して引数を受け取りたい

    C・Objective-C に関して全くの初心者ですが、よろしくお願いします。 Cocoa で作ったアプリをコマンドラインから実行して、渡した引数を NSObject のサブクラスで受け取りたいのですがどうしたらよいでしょうか。 main.m の main 関数で受け取る方法はわかったのですが、サブクラス MyObject.m 内の任意のメソッドに渡す方法がわかりません。 // 引数を受け取って表示する int main(int argc, char *argv[]) {   fprintf(stdout, "%s\n", argv[1]);   return NSApplicationMain(argc, (const char **) argv); } ご教示いただけますと幸いです。