前回はプロジェクト「0050_stringformatid」を新しく作り、いろいろな変数を形式を指定して画面表示するプログラムを作成しました。
今回は、新しくプロジェクト「0055_array」を作り、複数の変数を使うことのできる"配列"についてお話します。
配列とは一つの変数で同じ型(int型とかchar型とか)を大量に扱うことのできる仕組みです。 非常に利用の幅が広く、たとえばゲームでは大量の敵データや地形データなど、同じような型をつかった大量のデータを配列で扱ったりします。
ではでは配列を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「0055_array」を新しく用意し、プロジェクトに空の「Array.c」を追加し、下のソースコードをコピペして動かしてみましょう。
#include <stdio.h>
int main() {
int level = 3;
int maxhitpoint[6] = { 10, 15, 20, 26, 151, 157 };
char magicName[7] = "Check";
char enemyName[10] = "鬼うさぎ";
printf("ぷらんく:ステータス調査魔法「%s」を敵「%s」につかおう。"
, magicName, enemyName);
printf("ふむふむ、%s はレベル %d で、最大HPは %d くらい。\n"
, enemyName, level, maxhitpoint[level]);
level++;
printf("%s はレベル %d で、最大HPは %d !?\n"
, enemyName, level, maxhitpoint[level]);
printf("1 レベル差でステータス上がりすぎだね。成長期かな。\n");
}
コピペなりして、実行してみて下さい。
ぷらんく:ステータス調査魔法「Check」を敵「鬼うさぎ」につかおう。
ふむふむ、鬼うさぎ はレベル 3 で、最大HPは 26 くらい。
鬼うさぎ はレベル 4 で、最大HPは 151 !?
1 レベル差でステータス上がりすぎだね。成長期かな。
敵キャラ「鬼うさぎ」のステータスを「Check」という魔法でしらべたときの想定です。
配列とは「〇〇型をたくさん並べて、大量に使えるようにする」ということです。並べられた一つ一つは 要素とよばれます。たくさん並べた要素はPCのメモリの中で保存され、スペースが確保されます。このようなスペースを バッファーと呼びます。
int maxhitpoint[6] = { 10, 15, 20, 26, 151, 157 };
4行目では、int型の要素を6個もつ配列で maxhitpoint という変数名で宣言と初期化をしています。
この 「要素を6 個もつ」ということを記号[] の中で書いています。 また記号 {} の中で順番に 6 個のint型(整数)を代入しています。
この6個の要素には 変数名[添え字] という書き方でアクセスできます。添え字(そえじ)とは、配列の要素の番号みたいなものととらえてください。 maxhitpoint は下のように初期化されています。
ここで、添え字は 0 から始まることに気を付けてください。 ちょっと戸惑うかもしれませんが添え字は 0 から始まって、 5 で終わっているので、6個の要素を持つ配列が作られています。
読み出す方法は簡単で、例えばここ配列の添え字 3 つ目の中身を見たい時は、
printf("%d", maxhitpoint[3]);
のように書けば、「26」と表示されますし、この要素の内容の変更も
maxhitpoint[3] = 20;
と書けば、「26」から「20」に変更することができます。
プログラムを実行したとき、maxhitpoint の配列の中身はこんな感じです。
maxhitpoint のそれぞれの要素の中身
添え字 | [0] |
---|---|
内容 | 10 |
おさらいにもなりますが、「char 変数名[] 」は 前のページ で「char 型変数をたくさん並べて、たくさんの文字(日本語含む)を保存できるようにしている」というお話をしたかと思います。
これも配列のことで、たとえば下のような書き方で char型で要素を 7 個もった変数(配列)を作成しています。
char magicName[7] = "Check";
実際に「char magicName[7] ="Check";」が実行されたとき、メモリの中では下のようにスペースが確保されています。行「内容」と行「数値」は表現を変えただけで、同じ内容です。
例えば 'C' とは ASCII コード表でみると 67 であり、同じ内容です。
magicName のそれぞれの要素の中身
添え字 | [0] |
---|---|
内容 | 'C' |
数値 | 67 |
例えば 'C' は ASCIIコード上の数値では 67 で表せます。
「'\0'」はASCIIコード表での制御文字であり、数値では 0 になります。これは NULL終端文字とよばれています。
過去のページ「文字列変数の宣言、初期化と表示」でお話しましたが、 文字列を扱うときは文字列の終わりがどこかを示すために、配列の最後に数値 0 が必要となります。
今回は「Check」で5文字で6文字目に、終わりを示す数値 0 が代入されています。
ここで気を付けないといけないのは、
char name[7]; で文字の記憶に使えるのは実質 6 文字ぶんまでで、 1 文字は NULL終端文字に使う必要がある
ということです。
今回 magicName は 7 文字ぶんのサイズを用意しているため、NULL終端文字ぶんを除くと最大、6文字までが記憶できます。今回は 5 文字までしかつかってませんので、1文字分余裕がある状態、ということですね。
実際、添え字 6 番目の要素は使われてません。
NULL終端文字が文字列の最後になぜ必要なのでしょうか。 printf 関数などでchar型配列を文字列として扱うとき、このNULL終端文字で、文字列の終わりだと判断しているためです。 もしこのNULL終端文字が書いていなければ、NULL終端文字を見つけるまで、メモリの中を表示しつづけてしまいます。(バグってしまいます)
標準設定で日本語版 Windows OS コンソール上で日本語を扱うとき、 日本語1文字で char 型 2 個ぶんを使います。
(ASCIIコード表にのっているような英文字や数字は1文字で1バイトというサイズを使い、日本語は倍の 2 バイトを使う)
この時、enemyName は下のように配列の中身がそれぞれ代入されています。
enemyName の中身
添え字 | [0][1] | [2][3] | [4][5] | [6][7] | [8][9] | |
---|---|---|---|---|---|---|
内容 | 鬼 | う | さ | ぎ | '\0' |
日本語についてはchar型の配列の添え字と1対1の関係になってなかったりして、ちょっと扱いづらいですね。
日本語のような char 型1個文で一文字が収まらない文字はワイド文字と呼ばれます。
ASCIIコード表の文字だけでは表現できない、英語圏以外の国の言葉でもC言語上で扱えるように、char型ではなく専用のワイド文字を取り扱う機能( wchar型や専用の入力、出力用の関数)があったりします。
そのあたりは、また別のページでお話しようと思います。
このページのここまでのお話で、すでに残りのソースコードの各行がやっていることはわかるんじゃないかと思います。
printf("ぷらんく:ステータス調査魔法「%s」を敵「%s」につかおう。"
, magicName, enemyName);
printf("ふむふむ、%s はレベル %d で、最大HPは %d くらい。\n"
, enemyName, level, maxhitpoint[level]);
ここでは、文字列の中身を表示しています。
この時点で変数level には整数 3 が入っているので、maxhitpoint[level] はmaxhitpoint[3] ということになります。
配列の変数 maxhitpoint の要素[3]には整数 26 が入っていますので、「最大HPは 23 くらい。」と表示されることになります。
今回はここまで。お疲れさまでした。
更新日 | 更新内容 |
---|---|
更新なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: