• ベストアンサー

メイン関数

メイン関数には int main(void) と int main(int argc, char** argv) がありますが、後者のint argc, char** argv はどういう意味なのでしょうか?

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

こういう質問をするときは、環境を明確にした方がよいと思います。そうでないと一般論で回答しなければならず、どうしても表現があいまいになったり、非常に難しくなったりします。 argcとargvですが、これらはホスト環境がプログラムに情報を与えるために使用するものです。この情報は、プログラムの実行に先立ち、何らかの方法で決定されます。 具体的には、コマンドプロセッサを持つ環境の場合、プログラムを実行する際に付加した引数を渡すことになります。また、他のプログラムからexeclなどの処理系定義の方法を用いて呼び出した場合には、その呼出し時に指定した情報が渡されます。環境によっては、もっと別の方法で情報を定義するかもしれません。 argcが正の場合、argv[0]にはプログラム名が格納されます。このプログラム名がどんな形式で格納されるかは処理系に依存します。また、argv[argc]には空ポインタが格納されます。つまり、argcが0の場合、argv[0]は空ポインタになるため、mainの引数からプログラム名を知る手段がありません(そういう処理系が実在します)。 mainの最初の呼出しでは、argcが負になることはありません。 C言語では、mainは再帰的に呼び出すことができますので、2回目以降のmainの呼出しでは、argcとargvの意味は、プログラムでどんな引数を渡したかに依存します。

szatmari
質問者

お礼

回答ありがとうございます。

その他の回答 (3)

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.3

Cのプログラムは、起動すると「いきなりmainから実行し始める」訳ではありません。 実は「実行時ライブラリ」が一緒に組み込まれ、プログラムは「実行時ライブラリで用意されたエントリポイント」から実行開始されます。 その「実行時ライブラリ」は、色々な初期化をすると共に、実行時のコマンドラインを、mainに渡せるように加工、編集してから、mainを呼び出します。 main関数では、コマンドラインを利用しないのなら int main(void) と書きます。 コマンドラインを利用するなら int main(int argc, char** argv) とか int main(int argc, char* argv[]) とか書きます。 コマンドラインとは、コマンドを実行する時に打ち込んだ C:\>dir *.txt や sh% ls *.txt などの文字列「dir *.txt」や「ls *.txt」の事です。 実は、コマンドラインを利用しない場合であっても int main(int argc, char** argv) と書いても構わないのですが、最近のCコンパイラは「お節介」なので、使ってない引数や変数があると「識別子○○○が使用されていません」とワーニングを出します。 このワーニングが出るとうざったいので、コマンドラインを利用しない場合は int main(void) のように「使わない引数は書かない」のです。 で、argcやargvには、コマンドプロンプトやシェルで打ち込んだ文字列が加工され「引数の個数」と「分解した引数の配列」が渡されて来ます。

szatmari
質問者

お礼

回答ありがとうございます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

前者は作成したアプリを実行する際に 引数をとらない場合の書式です 後者は引数をとる場合の書式になります たとえば foo.exe といった実行ファイルが作成されている場合 前者は foo.exe[Enter] で起動されることを前提にしています 後者は foo.exe 123456 abc[enter] などのように パラメータ(引数)を与えられるようにすることが出来ます argcは 引数の数をカウントしています argvは 引数そのものを文字列のポインタでmain関数に渡します # この書式だと厳密にはargvの型は文字へのポインタのポインタですが 上記の例では argcは3になり argv[0]="foo.exe", argv[1]="123456", argv[2]="abc"が格納されます 私は int main( int argc, char* argv[] ) の方が好きですけど ・・・ 宣言の意味的にはほぼ同じです

szatmari
質問者

お礼

回答ありがとうございます。

noname#76085
noname#76085
回答No.1

本を使っての独習なのでしょうか? 私の場合(<技術・説明力不足のため)「関数」と「ポインタ」という用語を用いませんとうまく説明できる自信がない(C#ばっかり使っているので忘れてきた)ので、確認させていただきました。 本を使っての独習の場合は、たいてい後半のページに、関数、引数、ポインタなどが出てきます。 例えばBMI値を求める関数を自作したときに、    getBMI(double shincyou, double taijuu) とすると思いますが、main(int argc~~)とほとんど同じ意味です。 ちょっと概要だけの説明になってしまい、細かい点が違う、というような場合は、ご容赦願います。

szatmari
質問者

お礼

回答ありがとうございます。

関連するQ&A

  • 関数の引数の書き方。

    AとBのどちらの書き方でもよいのですか? 私が読んだ本(やさしいC)には、 Aパターンのみだったような? Aパターン ------------------ void main(int argc,char *argv[]) { int i; ・・・・ } Bパターン ------------------ void main(argc, argv) int argc; char *argv[]; { int i; ・・・・ } http://ash.jp/db/ora_c.htm

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

     今晩は、Cの初心者です宜しくお願いします。  main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、 「**argv」と「*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[]) 以外の引数を決めることは出来るのでしょうか。

  • OpenGLで登録したコールバック関数の引数

    OpenGLで画面を描画をする際に, 以下のソースのように,glutDisplayFuncに関数を登録しています. main関数で,定義した定数や,そのポインタを display_funcに渡したいと思うのですが, どのような方法があるのでしょうか? 現在,私は,グローバル変数を定義して,それをmain関数とdisplay関数で いじっています. ソースコードの整理,関数化のため,できれば,ポインタや引数を渡したいです. どうぞよろしくお願いします. --------------------------------------------- #include <GL/glut.h> void display_func(void) { 描画内容を記述 } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutCreateWindow(argv[0]); glutDisplayFunc(display_func); glutMainLoop(); return 0; } ---------------------------------------------

  • 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関数は、関数なのに戻り値や引数を省略して書ける仕様なのは、なぜなのか? ちょっと疑問に思ったのでこちらにお尋ねしました。

  • c言語

    (c++ではなくC89準拠) c言語について質問 (1) 関数名()と関数名(void)は違う意味 (2) mainの引数の型は(void)か(int argc, char *argv[]) (3) K&Rは標準c準拠でmain()という表記があります ということは、(1)の関数名とはmain以外の関数名で、 main()とmain(void)は同じなんでしょうか。

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

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

  • コマンドライン引数argv[]について

    C言語初心者です。以下のようなプログラムを書いたのですが、コンパイルで来ません。関数func1, func2を分けずに全てメインに書けば動作するのですが、なぜ関数に分けてしまうとコンパイル出来ないのかがわかりません。エラー内容は、argvが宣言されていない、といった内容です。 #include <stdio.h> void func1(void){ printf("%s\n", argv[1]); } void func2(void){ printf("%s\n", argv[2]); } int main(int argc, char *argv[]){ if(strcmp(argv[1], "abc")==0){ func1(); } else{ func2(); } }

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

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

専門家に質問してみよう