![]() |
|
文字列と配列の密接な関係文字列は配列で表現できることを知る 何気なくさけてきた「文字列」文字を表示させる事はもうできますね。しかも1byteの文字なら、char型の変数に代入できることも知ったと思います。では文字列は? 文字列というのは、文字の連なったもの、たとえば"眠い!"というものです。この「眠い!」という文字列を変数に取っておくことはできるのでしょうか。これを理解するには配列という概念を知っておく必要があります。 配列は便利な変数●変数をまとめて扱う 今までの変数は、「i」や「c」など、それぞれ独自の名前が付けられていました。もちろんi1,i2,i3などと数字を付けることもできます。しかし、このときの「1,2,3」は数字では無く、文字として扱われています。だから「i(1+2)」とやって、「i3」をあらわすことはできません。 しかし、場合によってはこのような表現ができたほうが、プログラムが簡単になります。これをできるようにしたのが配列です。
ここで注意したいのは、添字は0から始まっているので、左図のように最後はi[6]だということです。ここでi[7]とやっても、コンパイルエラーにはなりませんが、代入すると予期しない結果になることがあるので気をつけましょう。 i[0]、i[1]...は、それぞれ今まで使ってきた普通の変数と同じint型の変数なので、 i[0] = i[1] + i[2]; としてもいいことになります。 ●添字は変数でもいい
このプログラムでは、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型の配列を作ります。
この例では、宣言のときに "ABC"を代入しているように見えますが、代入ではありません。前にちらっと書いたのですが、これは「初期化」です。
ところで、最後に「'\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の先頭アドレスをあらわす「定数」になるからです。 余談:
さあそれでは、いよいよ次回はキーボードから文字列を受け取る方法をお教えします。さて、そろそろなにか面白いプログラムを作りたいと思いませんか? テキストベースならば、次回までの知識で、ある程度のプログラムが作れるようになります。計算機? トランプゲーム? それとも昔なつかしのゲームブックをプログラムで作っちゃいますか? 自分が作りたい! と思ったもの、それは必ず作ることができます。今はそのための基礎固めです。頑張りましょう! まとめ。
質問(1997/02/03 公開, 1999/03/13 改) |
![]() |
著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.