第28回
データ構造(7)~ポインタの配列とポインタのポインタ

パラメータの数と内容を取得する

main関数の引数であるargcとargvは、コマンドラインに与えられたパラメータの数とその内容を示しています。プログラムの中でそれらを取得する方法を紹介しましょう。

argcとargv

main関数の2つの引数は以下のような意味を持っています。

・第1引数(int argc)
int型のargcは、コマンドラインに記述されたパラメータの数を表します。
スペースまたはタブで区切られたコマンドライン上の単語を数え、それをmain関数に渡されます。
プログラム名自体もパラメータとして数えられるため、最低でも1となります。
argcが1の場合は『プログラムに与えるパラメータがない』ということです。

・第2引数(char *argv[])
argvは『ポインタの配列』という形です。スペースまたはタブで区切られた各パラメータは文字列──char型配列として保持されるので、それらを指すポインタを先頭から順に配列とし、その先頭アドレスが第2引数としてmain関数に渡されるのです。

argvはポインタの配列

int型の第1引数argcはすぐに理解できるでしょう。難しいのは『ポインタの配列』という第2引数のargvです。

コマンドラインに入力された各文字列は、例えば図1のような形でメモリに保存されます。それぞれ独立した文字列なので、終端にはNULL(\0)が置かれます。実際には、図1のように綺麗に並んで保存されるかどうかは分かりません。処理系によって異なる部分です。

ただ、それぞれの文字列の先頭アドレス(配列の先頭要素のアドレス)は明確になっています。このアドレスをchar型のポインタとして並べて配列とし、その最後に終端を表すNULLを配置すると図2のようになります。

この状態が『ポインタの配列』です。配列の先頭要素を受け取れば、要素を順にたどって複数の文字列をすべて取り出せます。そして、配列の要素数は常にパラメータの数を表すargcと同じになります。



コマンドライン・パラメータの取得

従って、main関数ではコマンドライン・パラメータの内容を以下のような形で取得できます。

argc[0]:char型配列“search”の先頭要素
argc[1]:char型配列“abc.txt”の先頭要素
argc[2]:char型配列“table”の先頭要素
argc[3]:配列終端を示すNULL

先に例に挙げたプログラム“search”では、以下のようにして自身に与えられたファイル名と単語を取り出せます。

このソースを単独のプログラムとしたものが、サンプルに“ex2801.c”として収録されています。

  char *filename, *word;
  filename = argv[1];
  word = argv[2];