KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


文字列と配列の密接な関係

文字列は配列で表現できることを知る

 

何気なくさけてきた「文字列」

 文字を表示させる事はもうできますね。しかも1byteの文字なら、char型の変数に代入できることも知ったと思います。では文字列は? 文字列というのは、文字の連なったもの、たとえば"眠い!"というものです。この「眠い!」という文字列を変数に取っておくことはできるのでしょうか。これを理解するには配列という概念を知っておく必要があります。

 

配列は便利な変数

変数をまとめて扱う

 今までの変数は、「i」や「c」など、それぞれ独自の名前が付けられていました。もちろんi1,i2,i3などと数字を付けることもできます。しかし、このときの「1,2,3」は数字では無く、文字として扱われています。だから「i(1+2)」とやって、「i3」をあらわすことはできません。

 しかし、場合によってはこのような表現ができたほうが、プログラムが簡単になります。これをできるようにしたのが配列です。

 
#include <stdio.h>

main()
{
  int i[7];

  i[0] = 10;
  i[1] = 20;

  printf("%d %d\n", i[0], i[1]);
}

 宣言のときに、iの後ろに[7]がついています。これは7個のデータ領域をもつ配列変数を宣言することを意味します。この時点で、右の図のようにint型の値が入る領域が7つ確保されたわけです。

 付けた名前(配列名)のあとに、四角いカッコを付けると、一つ一つの配列にアクセスすることができます。ここでは「i[0] = 10」とすることで、配列名iの0番目のところに10を代入しています。この「[0]」の事を添字と言うことがあります。

 ここで注意したいのは、添字は0から始まっているので、左図のように最後はi[6]だということです。ここでi[7]とやっても、コンパイルエラーにはなりませんが、代入すると予期しない結果になることがあるので気をつけましょう。

 i[0]、i[1]...は、それぞれ今まで使ってきた普通の変数と同じint型の変数なので、

  i[0] = i[1] + i[2];

としてもいいことになります。

添字は変数でもいい

 
#include <stdio.h>

main()
{
  int i[10], j;

  for(j=0; j<10; j++)
    i[j] = 0;
}

 このプログラムでは、for文を使って変数jを0から9まで増やしています。その間に実行されるのは、

  i[j] = 0;

です。このように添字には数字以外に、変数を入れることもできます。つまりこの例ではi[0]〜i[9]全てに0を代入しています。

 このように、なんども同じような事をやりたいときは、配列を使うと便利です。

再びpさんの登場

 さて、もちろんi[0]、i[1]...それぞれにも住所があります。前にも言ったように、普通の変数と同じように扱うことができるので、

  int *p, i[10];
  p = &i[0];

と書くことができます。

 そして特に添字が0の配列の要素の住所は、「&」をつけずに、配列名「i」だけで表現できます。なので、上の例は次のように書き換えることができます。

  int *p, i[10];
  p = i;

 また、調べてみると分かりますが、配列のアドレスはそれぞれ隣り合っています。つまり2バイトのint型の配列を作ったとき、i[0]のアドレスが「100」だったら、i[1]は「102」、i[2]は「104」となります。

 

文字列は配列で表現できる?

 もう題名から分かりますね、文字列は配列で表現できます。たとえば、「ABC」という文字列を表現したい。そういう時は「文字」を扱うchar型の配列を作ります。

 
#include <stdio.h>

main()
{
  char s[4] = "ABC";

  printf("%s\n", s);
}

 この例では、宣言のときに "ABC"を代入しているように見えますが、代入ではありません。前にちらっと書いたのですが、これは「初期化」です。

 "ABC"で初期化させると、左図のように、先頭から'A'、'B'、'C'、'\0'を書かれます。前にも言いましたが、'A' や 'B' は、文字コード表を元にして、0〜255までの数値に置き換えられます。

 ところで、最後に「'\0'」という見慣れない文字が出てきました。これはヌル文字と呼ばれるもので、実際には「0」という数値です。これはC言語を扱ううえで非常に重要で、文字列を扱う場合に文字列の終わりを判断するために使われます。そのために、配列Sは、「ABC」と、このヌル文字も含めた4つぶんの領域を確保するようにします。

 上の例のように、printf関数で「%s」を指定すると、文字列を表示することができます。この時指定するのは、文字列の最初のアドレスです。そのため、この例では配列名「s」を指定しています(配列名だけだと、先頭のアドレスになるんでしたよね)。すると、printf関数は、そのアドレスのに書かれている数値を文字にして表示し、次の番地に移ってまた同じことをします。それを0と書かれた立て札に出会うまでくり返します。

 だから、メモリ上に「'A', 'B', 'C', '\0'」と書くと、「ABC」と表示されるわけです。

 もし、あなたがBASICやPascalを一度使ったことがあるなら、

    char s[] ="ABC";
    s = "CDE";

というように代入したくなるかもしれません。が、これはできません。なぜならsは代入されるものではないからです。「s」と書くと、あくまで配列sの先頭アドレスをあらわす「定数」になるからです。

余談:

このように宣言の時に添字を書かないと、自動的に必要な分だけの領域を確保してくれます。つまりこの時は添字に「4」を指定したのと同じことです。

 さあそれでは、いよいよ次回はキーボードから文字列を受け取る方法をお教えします。さて、そろそろなにか面白いプログラムを作りたいと思いませんか? テキストベースならば、次回までの知識で、ある程度のプログラムが作れるようになります。計算機? トランプゲーム? それとも昔なつかしのゲームブックをプログラムで作っちゃいますか?

 自分が作りたい! と思ったもの、それは必ず作ることができます。今はそのための基礎固めです。頑張りましょう!

 

まとめ。

  1. 配列は、同じ型の変数を幾つかまとめて扱いたい時に有効。
  2. 添字には数値だけでは無く変数を使える。(「式」を書くことができる)
  3. 配列は、10個の領域を確保したら、添字は0〜9まで。
  4. 配列名だけを書くと、その配列の先頭のアドレスを示す。
  5. 文字列はchar型の配列で表現することができる。
  6. printf関数で「%s」を使い、ヌル文字で終わる文字列の先頭のアドレスを与えると、文字列を表示することができる。
 

質問

(1997/02/03 公開, 1999/03/13 改)

[目次へ] [次へ]

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて