
6日でできる 新C言語入門|C言語のargcとargvの基本
プログラムは、起動時にも情報を受け取れる。
argcとargvを理解して、コマンドラインから値を渡せるC言語プログラムを作ろう。
C言語のmain関数は、ただプログラムの開始地点になるだけではありません。書き方によっては、プログラムを実行するときに外から渡された文字列を受け取ることもできます。
そのために使うのが、main関数の引数であるargcとargvです。
よく見るmain関数は、次のような形かもしれません。
int main(void)この形は、プログラムに実行時の引数を渡さない場合によく使います。
一方、コマンドライン引数を受け取りたい場合は、次のような形でmain関数を書きます。
int main(int argc, char** argv)argcは、プログラムに渡された引数の個数を表します。
argvは、渡された引数の文字列を順番に保存している配列です。
ここで大切なのは、argv[0]には通常、実行ファイル名や実行ファイルのパスが入るという点です。つまり、ユーザーが特別な引数を何も指定しなくても、argcは1になることが多いです。
この記事では、argcとargvの意味、コマンドライン引数の受け取り方、argv[0]の役割、Visual Studio 2026での引数設定方法、実行環境による違いまで、サンプルプログラムを使ってやさしく解説していきます。
main関数の引数で実行時の情報を受け取る
C言語のプログラムは、実行時に外から情報を受け取れるようになっています。
たとえば、コマンドラインから次のように実行する場面を考えます。
myprog Tokyo Osaka Nagoyaこのとき、プログラム名のあとに書かれたTokyo、Osaka、Nagoyaを、C言語プログラムの中で受け取れます。
この仕組みを使うと、プログラムを実行するたびに入力内容を変えたり、処理対象のファイル名を渡したり、動作モードを指定したりできます。
C言語では、その情報をmain関数の引数として受け取ります。
int main(int argc, char** argv)また、次のように書くこともできます。
int main(int argc, char* argv[])この2つは、main関数の引数としては同じ意味で使えます。
| 書き方 | 意味 |
|---|---|
| int argc | コマンドライン引数の個数 |
| char** argv | コマンドライン引数の文字列配列 |
| char* argv[] | char** argvと同じ意味で使える書き方 |
argvは、文字列へのポインタが並んだ配列です。少し難しく見えますが、まずは文字列が順番に入っている配列と考えると分かりやすいです。
argcは引数の個数を表す
argcは、argument countの略として説明されることが多く、引数の個数を表します。
ここで注意したいのは、プログラム名そのものも1つの引数として数えられることです。
たとえば、プログラムを引数なしで実行した場合でも、argv[0]には実行ファイル名が入るため、argcは1になります。
| 実行内容 | argcの値 | 説明 |
|---|---|---|
| プログラムだけを実行 | 1 | argv[0]に実行ファイル名が入る |
| プログラム名のあとに1つ指定 | 2 | argv[0]とargv[1]がある |
| プログラム名のあとに3つ指定 | 4 | argv[0]からargv[3]まである |
argcを見ることで、プログラムに何個の文字列が渡されたのかを判断できます。
たとえば、最低1つの引数が必要なプログラムなら、argcが2以上かどうかを確認するとよいです。
argvは引数文字列の配列を表す
argvは、argument vectorの略として説明されることが多く、コマンドライン引数の文字列を順番に保存している配列です。
| 要素 | 入る内容 |
|---|---|
| argv[0] | 実行ファイル名、または実行ファイルのパス |
| argv[1] | 1つ目のコマンドライン引数 |
| argv[2] | 2つ目のコマンドライン引数 |
| argv[3] | 3つ目のコマンドライン引数 |
たとえば、次のように実行したとします。
myprog apple bananaこの場合、引数の対応は次のようになります。
| 要素 | 内容 |
|---|---|
| argv[0] | myprog |
| argv[1] | apple |
| argv[2] | banana |
argv[0]にはプログラム自身の名前が入り、argv[1]以降にユーザーが指定した引数が入ります。
図:argcとargvの基本構造

この図から分かること
この図から分かるのは、コマンドラインで指定した文字列が、main関数のargcとargvに渡されるということです。
argcには引数の個数が入り、argvにはそれぞれの文字列が順番に入ります。argv[0]にはプログラム名が入るため、ユーザーが指定した引数はargv[1]以降に入る点が大切です。
コマンドライン引数はスペースで区切られる
コマンドライン引数は、基本的にスペースで区切られます。
たとえば、次のように実行した場合です。
./myprog apple bananaこの場合、appleとbananaは別々の引数として扱われます。
一方、スペースを含む文字列を1つの引数として渡したい場合は、ダブルクオーテーションで囲みます。
./myprog "hello world"この場合、hello world全体が1つの引数として扱われます。
| コマンド実行例 | argcの値 | argv[0] | argv[1] | argv[2] | argv[3] |
|---|---|---|---|---|---|
| ./myprog | 1 | ./myprog | なし | なし | なし |
| ./myprog apple banana | 3 | ./myprog | apple | banana | なし |
| ./myprog "hello world" | 2 | ./myprog | hello world | なし | なし |
この仕組みを理解しておくと、コマンドラインからプログラムに設定値やファイル名を渡す処理が作りやすくなります。
argcとargvを表示するプログラム
まずは、argcの値とargvの中身を表示するプログラムで確認してみましょう。
プロジェクト/ファイル名: Lesson62_1/main.c
#include <stdio.h>
int main(int argc, char** argv) {
int i;
printf("argcの値:%d\n", argc);
for (i = 0; i < argc; i++) {
printf("argv[%d] : %s\n", i, argv[i]);
}
return 0;
}このプログラムでは、main関数でargcとargvを受け取っています。
for文では、iを0からargc未満まで変化させ、argv[i]を順番に表示しています。
for (i = 0; i < argc; i++) {
printf("argv[%d] : %s\n", i, argv[i]);
}argcは引数の個数です。
そのため、argv[0]からargv[argc - 1]までを表示すれば、渡された引数をすべて確認できます。
実行例を確認する
コマンドライン引数なしで実行した場合、argcは1になります。
実行例1
argcの値:1
argv[0] : C:\Users\joeac\source\repos\Lesson62_1\x64\Debug\Lesson62_1.exeこの場合、ユーザーが追加の引数を指定していなくても、argv[0]に実行ファイルのパスが入っています。
そのため、argcは0ではなく1になります。
次に、コマンドライン引数として東京、大阪、名古屋を指定した場合を見てみます。
実行例2
argcの値:4
argv[0] : C:\Users\joeac\source\repos\Lesson62_1\x64\Debug\Lesson62_1.exe
argv[1] : 東京
argv[2] : 大阪
argv[3] : 名古屋この場合、argv[0]に実行ファイルのパス、argv[1]に東京、argv[2]に大阪、argv[3]に名古屋が入ります。
argcの値は4です。これは、実行ファイル名を含めて4個の引数があるためです。
Visual Studio 2026でコマンドライン引数を設定する
Visual Studio 2026でコマンドライン引数を指定して実行する場合は、プロジェクトの設定から引数を入力できます。
手順は次のようになります。
| 手順 | 操作 |
|---|---|
| 1 | プロジェクトを右クリックしてプロパティを選択する |
| 2 | 構成プロパティのデバッグを選択する |
| 3 | コマンド引数に渡したい文字列を入力する |
| 4 | OKボタンを押して設定を保存する |
| 5 | デバッグ実行してargcとargvの中身を確認する |
たとえば、コマンド引数に次のように入力します。
東京 大阪 名古屋すると、プログラム側では次のように受け取れます。
| 要素 | 内容 |
|---|---|
| argv[0] | 実行ファイルのパス |
| argv[1] | 東京 |
| argv[2] | 大阪 |
| argv[3] | 名古屋 |
Visual Studio 2026でコマンドライン引数を指定して実行する
Visual Studioでは、コマンドプロンプトを直接使わなくても、デバッグ設定からコマンドライン引数を指定できます。
1.Visual Studio 2026 で、コマンドライン引数を設定するには「プロジェクト」を右クリくしてプロパティを選択します。

2.「構成プロパティ」の「デバック」をクリックします。

3.「コマンド引数」という項目に「東京 大阪 名古屋」と入力して、「OK」ボタンをクリックします。

argcの値:4
argv[0] : C:\Users\joeac\source\repos\Lesson62_1\x64\Debug\Lesson62_1.exe
argv[1] : 東京
argv[2] : 大阪
argv[3] : 名古屋図:Visual Studioで設定した引数がargvへ渡る流れ

この図から分かること
この図から分かるのは、Visual Studioのコマンド引数に入力した内容が、プログラム実行時にmain関数へ渡されるということです。
東京、大阪、名古屋の3つを指定した場合でも、argv[0]には実行ファイルのパスが入るため、argcは4になります。コマンドライン引数を確認するときは、argv[0]を含めて数えることが大切です。
argv[0]には実行ファイル名やパスが入る
argv[0]には、実行ファイル名や実行ファイルのパスが入ります。
ただし、どのような形で入るかは実行環境や起動方法によって変わることがあります。
| OSや環境 | argv[0]の例 |
|---|---|
| Windows | C:\Program Files\myapp.exe |
| UNIX/Linux | /home/user/myapp |
| macOS | /Users/user/myapp |
| カレントディレクトリから実行 | ./myprog |
Windowsではバックスラッシュを使ったパス表記がよく見られます。
UNIX、Linux、macOSではスラッシュを使ったパス表記がよく見られます。
ただし、どの環境でも基本的な考え方は同じです。argv[0]にはプログラム自身を表す文字列が入り、argv[1]以降にユーザーが指定した引数が入ります。
main関数の書き方は2通りある
main関数でコマンドライン引数を受け取る書き方には、主に次の2つがあります。
int main(int argc, char** argv)
int main(int argc, char* argv[])どちらも、argcで引数の個数を受け取り、argvで引数文字列の並びを受け取るという意味です。
| 書き方 | 読み方のイメージ |
|---|---|
| char** argv | 文字列へのポインタの集まり |
| char* argv[] | 文字列ポインタの配列 |
argvは、複数の文字列を扱います。
それぞれのargv[i]は、1つの文字列を指しています。
たとえば、argv[1]が東京なら、argv[1]は東京という文字列の先頭を指していると考えられます。
char** argvをイメージで理解する
char** argvという書き方は、最初は少し難しく見えるかもしれません。
C言語の文字列は、char配列として扱われます。
そして、文字列の先頭アドレスはchar*で表せます。
argvは、そのchar*が複数並んだものです。
| 表現 | 意味 |
|---|---|
| char | 1文字 |
| char* | 文字列の先頭を指すポインタ |
| char** | 文字列ポインタの並びを指すポインタ |
| char* argv[] | 文字列ポインタの配列 |
つまり、argvは文字列そのものを1つだけ持っているのではなく、複数の文字列への入り口を並べて持っているようなものです。
図:argvは文字列ポインタの配列として考えられる

この図から分かること
この図から分かるのは、argvが文字列を順番に扱うための配列のような構造になっているということです。
argv[0]、argv[1]、argv[2]、argv[3]は、それぞれ別々の文字列を指しています。argcは、その個数を表しています。char** argvという形は、文字列ポインタが複数並んでいるものとして考えると理解しやすくなります。
コマンドライン引数の一覧を表示するプログラム
次のプログラムでは、渡されたコマンドライン引数を一覧表示します。
プロジェクト/ファイル名: Lesson62_2/main.c
#include <stdio.h>
int main(int argc, char** argv) {
int i;
printf("コマンドライン引数の一覧を表示します。\n");
for (i = 0; i < argc; i++) {
printf("argv[%d] : %s\n", i, argv[i]);
}
return 0;
}このプログラムも、argcの数だけfor文を回し、argv[i]を順番に表示しています。
for (i = 0; i < argc; i++) {
printf("argv[%d] : %s\n", i, argv[i]);
}argvには、実行時に渡された文字列が入っています。
iが0のときはargv[0]を表示し、iが1のときはargv[1]を表示します。
Visual Studio 2026で引数を指定して実行する例
Visual Studio 2026で、Lesson62_2にコマンドライン引数を設定して確認します。
手順は次の通りです。
| 手順 | 操作 |
|---|---|
| 1 | プロジェクトを右クリックしてプロパティを選択する |
| 2 | 構成プロパティのデバッグをクリックする |
| 3 | コマンド引数にあいう えお かきくと入力する |
| 4 | OKボタンをクリックする |
| 5 | デバッグ実行して結果を確認する |
1.Visual Studio 2022 で、コマンドライン引数を設定するには「プロジェクト」を右クリくしてプロパティを選択します。

2.「構成プロパティ」の「デバック」をクリックします。

3.「コマンド引数」という項目に「あいう えお かきく」と入力して、「OK」ボタンをクリックします。

実行結果
コマンドライン引数の一覧を表示します。
argv[0] : C:\Users\joeac\source\repos\Lesson62_2\x64\Debug\Lesson62_2.exe
argv[1] : あいう
argv[2] : えお
argv[3] : かきくこの結果を見ると、コマンド引数に入力したあいう、えお、かきくが、argv[1]以降に順番に入っていることが分かります。
argv[0]には実行ファイルのパスが入っているため、argcは4になります。
argcとargvを使うときの注意点
argcとargvを使うときは、次の点に気を付けましょう。
argv[0]を含めて数える
argcには、argv[0]も含まれます。
ユーザーが指定した引数だけを数えたい場合は、argc - 1で考えると分かりやすいです。
たとえば、argcが4なら、ユーザーが指定した引数はargv[1]、argv[2]、argv[3]の3個です。
argv[1]を使う前にargcを確認する
追加の引数があるとは限りません。
たとえば、argv[1]を使いたい場合は、argcが2以上かを確認する必要があります。
if (argc >= 2) {
printf("%s\n", argv[1]);
}argcを確認しないままargv[1]へアクセスすると、存在しない要素を参照してしまう可能性があります。
スペースを含む引数はダブルクオーテーションで囲む
コマンドラインでは、スペースで引数が分かれます。
1つの引数としてhello worldのような文字列を渡したい場合は、ダブルクオーテーションで囲みます。
myprog "hello world"これにより、hello worldが1つの引数としてargv[1]に入ります。
argvの内容は文字列として受け取る
argvに入る内容は、基本的に文字列です。
たとえば、次のように数値らしい引数を渡したとしても、argv[1]は文字列として受け取られます。
myprog 100この100を数値として計算に使いたい場合は、文字列から数値へ変換する処理が必要です。
argcとargvが役立つ場面
argcとargvを使うと、プログラムの使い方が広がります。
| 活用場面 | 内容 |
|---|---|
| ファイル名を渡す | 処理対象のファイルを実行時に指定できる |
| 動作モードを指定する | debugやreleaseなどのモードを引数で切り替えられる |
| 検索キーワードを渡す | コマンドラインから検索語を受け取れる |
| 数値設定を渡す | 回数やサイズなどを実行時に指定できる |
| 複数の入力値を渡す | argv[1]以降を順番に処理できる |
たとえば、ファイルを読み込むプログラムでは、ファイル名をargv[1]で受け取る形がよく使われます。
コマンドライン引数を使うと、プログラムを実行するたびにソースコードを書き換えなくても、外から値を渡して動作を変えられます。
argcとargvの関係を整理する
argcとargvの関係を整理すると、次のようになります。
| 項目 | 内容 |
|---|---|
| argc | コマンドライン引数の個数 |
| argv | 引数文字列の配列 |
| argv[0] | 実行ファイル名やパス |
| argv[1]以降 | ユーザーが指定した引数 |
| 引数なしの場合 | argcは1になることが多い |
| スペース区切り | スペースごとに別の引数になる |
| ダブルクオーテーション | スペースを含む文字列を1つの引数にできる |
main関数の引数を使うと、プログラム起動時の情報を受け取れるようになります。
これにより、単に実行するだけのプログラムから、外部から指定された内容に応じて動くプログラムへ発展させられます。
コマンドライン引数を理解すると実用的なプログラムに近づく
argcとargvは、C言語プログラムが実行時に外から情報を受け取るための仕組みです。
argcは引数の個数を表し、argvは引数文字列の並びを表します。argv[0]には実行ファイル名やパスが入り、argv[1]以降にユーザーが指定した引数が入ります。
Visual Studio 2026では、プロジェクトのプロパティからコマンド引数を設定できます。コマンド引数に東京 大阪 名古屋のように入力すれば、プログラム側ではargv[1]、argv[2]、argv[3]として受け取れます。
argcとargvを理解すると、ファイル名や設定値を実行時に渡せるようになります。これは、実用的なC言語プログラムを作るうえでとても大切な考え方です。
