*** 配列について ***

ここでは配列について説明します。配列というのは int 型なら int 型のデータを複数で一つのまとまったデータと見なすものをいいます。

int a[10];

と書いた時には int 型の変数を10個用意するという事です。数学でいうところの数列に良く似ています。

注意すべき事はここでの宣言で使用できるようになる10個の変数というのは、

a[0], a[1], a[2],‥‥‥‥‥, a[8], a[9]

の10個のことをいいます。決して変数 a[10] というものが使用できるようになるわけではありません。

どうしても変数 a[10] を使用したいのならば a[要素数] の要素数のところに 11 以上の数を書いてください。

 

*** 配列と関数 ***

このことについてはプログラムを実際に見てみましょう。下に挙げるプログラムは最も原始的な方法で配列を大きい方から順に整列するプログラムです。

さてこのプログラムの説明をしますが、このプログラムの中で新しい事というのは二つです。

1 : scanf の使い方が今までと異なる

2 : 関数(これから説明します)という概念が出てきている

ということでしょう。まず、前者の方ですが、こちらについては実際にプログラムを動かした方が分かりやすいでしょう。

プログラム中の scanf("%d",a+i); は scanf("%d",&a[i]); と同じ意味です。

次に、新しく登場してきた関数という概念ですが、これは今のところあまり理解しなくても良い概念です。ただし、念の為に知っておいて欲しい事は、この関数とは一度定義したらその後はその関数を呼び出す事である一定の決まった動作を行う事ができるというものであるという事です。ここで行っている動作は配列の整列でこの関数があるため配列の長さが10の配列に対しては関数を呼び出すだけで整列をする事ができます。

a というのは配列 a[10] の先頭のアドレスです。

アドレスというのは 文字通り住所のことですが、ここの住所に変数が住んでいると思っておけば良いでしょう。関数に配列を渡すときは配列が住んでいる場所を関数に教えてあげるのです。そうすれば関数は自分でその場所へ行って、変数を処理してくれます。

また、関数の側ではどのように 仮引数を定義すれば良いのかというと int a[10] , int a[] , int *a 等が考えられます。この場合配列の長さが決まっているので、 最初のものを採用しました。

関数 SORT は返値を持っていませんが、なぜこれで変数が変わるのかというと、関数 SORT では変数の処理を先ほどもいった通りそのアドレスを指定して直接行っているからです。このため返値を持たなくても変数を変えることができるのです。

最後に付け加えておくとC言語では関数の引数、返値ともに配列そのものを持つことはできません。従ってどうしてもアドレスを指定する方式をとらざるを得ません。

 

*** 先ほどの説明の補足 ***

ここでは値の交換について説明します。これは先ほどのプログラムで使用していたのですが、都合により説明をカットしたところです。

では、二つの変数の値の交換方法を考えてみましょう。まずは各自で考えてみてください。

考えましたか? では答えを二つだけ教えましょう。もちろんこのほかにも答えはあります。

まず一つ交換すべき値を持つ変数 a,b に加えさらに変数 c を用いる方法です。これは次のように

とします。これで a,b の値が交換されたことになるわけです。

また、もう一つの手として考えられるのは、交換すべき変数 a,b だけを用いて

とする手段です。これでも値の交換を行うことができます。(先のプログラムではこの方法を用いています)もちろんこのほかにもいろいろな値交換方法が考えられるので各自で考えてください。

また当然のことですが、上の二つの方法で値の交換がなぜ行われるのかという理由についても考えておいてください。

 

*** 文字列の使用方法 ***

さて、char型の変数を用いて文字を表現できるという事は説明しましたが、このことは当然、char型の配列を用いることにより、文字列を表現できるという事を意味しています。

では、具体的にどのようにしてこれを実現すれば良いのでしょうか? それについて説明します。

まず宣言方法ですが、

char a[10];

と書きます。

このように書いておくと十文字分の文字列を使用することができるようになるわけです。ただしここで注意すべき事は、この十文字文の中には NULL 文字というのも含まれているために、実際に自分が使えるものは九文字だけです。

次に代入方法です。この場合まとめて配列(文字列)a に代入する手段はありませんので一つづつ代入していきます

a[0] = 't';

a[1] = 'e';

a[2] = 's';

a[3] = 't';

としただけでは間違いです。

ちゃんと最後に NULL を代入しましょう。

a[4] = (char)NULL;

これで完成です。実際にはコンパイラには自動的にデータ型を変換するという機能がついているので、(char)は要らないのですが、細かいことをちゃんと書いておくと、あとから見たときに分かりやすいプログラムになります。もちろん慣れてきたら(char)は外しても問題ないでしょう。

続いて初期化の方法ですが、次のように行います。

char a[] = "test";

この時、[ ] 内には本来なら要素数+1以上の数を書くべきなのですが、それはコンパイラが自動的に選択してくれるので問題ありません。