Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2018年6月26日に更新

第2章07 変数に配列を使う

イチからゲーム作りで覚えるC言語
第2章06 いろんな書式指定子 : PREV
NEXT : 第2章08 プログラムにコメントを書く :

この記事でやること

前回はプロジェクト「0050_stringformatid」を新しく作り、いろいろな変数を形式を指定して画面表示するプログラムを作成しました。

今回は、新しくプロジェクト「0055_array」を作り、複数の変数を使うことのできる"配列"についてお話します。

配列を使ったプログラム

配列とは一つの変数で同じ型(int型とかchar型とか)を大量に扱うことのできる仕組みです。 非常に利用の幅が広く、たとえばゲームでは大量の敵データや地形データなど、同じような型をつかった大量のデータを配列で扱ったりします。

同じオブジェクトを配列で

ではでは配列を取り扱うサンプルプログラムを作成してみましょう。

プロジェクト「0055_array」を新しく用意し、プロジェクトに空の「Array.c」を追加し、下のソースコードをコピペして動かしてみましょう。

 
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");
}

コピペなりして、実行してみて下さい。

Array.c
ぷらんく:ステータス調査魔法「Check」を敵「鬼うさぎ」につかおう。
ふむふむ、鬼うさぎ はレベル 3 で、最大HPは 26 くらい。
鬼うさぎ はレベル 4 で、最大HPは 151 !?
1 レベル差でステータス上がりすぎだね。成長期かな。

敵キャラ「鬼うさぎ」のステータスを「Check」という魔法でしらべたときの想定です。

配列とバッファーの中身 鬼ウサギに Check の魔法

配列とは「〇〇型をたくさん並べて、大量に使えるようにする」ということです。並べられた一つ一つは 要素とよばれます。たくさん並べた要素はPCのメモリの中で保存され、スペースが確保されます。このようなスペースを バッファーと呼びます。

配列の要素のイメージ 配列の要素のイメージ

 
Array.c
 int maxhitpoint[6] = { 10, 15, 20, 26, 151, 157 };

4行目では、int型の要素を6個もつ配列で maxhitpoint という変数名で宣言と初期化をしています。

この 「要素を6 個もつ」ということを記号[] の中で書いています。 また記号 {} の中で順番に 6 個のint型(整数)を代入しています。

この6個の要素には 変数名[添え字] という書き方でアクセスできます。添え字(そえじ)とは、配列の要素の番号みたいなものととらえてください。 maxhitpoint は下のように初期化されています。

  • maxhitpoint[0] に整数 10 が代入されている。
  • maxhitpoint[1] に整数 15 が代入されている。
  • maxhitpoint[2] に整数 20 が代入されている。
  • maxhitpoint[3] に整数 26 が代入されている。
  • maxhitpoint[4] に整数 151 が代入されている。
  • maxhitpoint[5] に整数 157 が代入されている。

ここで、添え字は 0 から始まることに気を付けてください。 ちょっと戸惑うかもしれませんが添え字は 0 から始まって、 5 で終わっているので、6個の要素を持つ配列が作られています。

int型の配列の中身と添え字 int型の配列の中身と添え字

読み出す方法は簡単で、例えばここ配列の添え字 3 つ目の中身を見たい時は、

配列の要素の読み込み例
printf("%d", maxhitpoint[3]);

のように書けば、「26」と表示されますし、この要素の内容の変更も

配列の要素の変更例
maxhitpoint[3] = 20;

と書けば、「26」から「20」に変更することができます。

バッファーの中身

プログラムを実行したとき、maxhitpoint の配列の中身はこんな感じです。

maxhitpoint のそれぞれの要素の中身

添え字 [0]
内容 10

文字列を使ったときの配列とバッファーの中身

おさらいにもなりますが、「char 変数名[] 」は 前のページ で「char 型変数をたくさん並べて、たくさんの文字(日本語含む)を保存できるようにしている」というお話をしたかと思います。

これも配列のことで、たとえば下のような書き方で char型で要素を 7 個もった変数(配列)を作成しています。

 
Array.c
 char magicName[7] = "Check";

実際に「char magicName[7] ="Check";」が実行されたとき、メモリの中では下のようにスペースが確保されています。行「内容」と行「数値」は表現を変えただけで、同じ内容です。

例えば 'C' とは ASCII コード表でみると 67 であり、同じ内容です。

magicName のそれぞれの要素の中身

添え字 [0]
内容 'C'
数値 67

例えば 'C' は ASCIIコード上の数値では 67 で表せます。

「'\0'」はASCIIコード表での制御文字であり、数値では 0 になります。これは NULL終端文字とよばれています。

文字列と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終端文字を見つけるまで、メモリの中を表示しつづけてしまいます。(バグってしまいます)

日本語の文字列をchar型配列に代入したときの配列の中身

標準設定で日本語版 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型や専用の入力、出力用の関数)があったりします

そのあたりは、また別のページでお話しようと思います。

配列の中身の表示

このページのここまでのお話で、すでに残りのソースコードの各行がやっていることはわかるんじゃないかと思います。

 
Array.c
 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 くらい。」と表示されることになります。

あとがき

今回はここまで。お疲れさまでした。

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
更新なし
イチからゲーム作りで覚えるC言語
第2章06 いろんな書式指定子 : PREV
NEXT : 第2章08 プログラムにコメントを書く :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

ゲーム等で使えるつなぎ目のないループするテクスチャ画像の作り方

#ツール#ゲームプログラミング✎ 2021-01-24
ゲームなどで使えるループ画像、パターンテクスチャのツール、手動での作り方をまとめ
広告領域
追従 広告領域
目次
第2章07 変数に配列を使う
第2章07 変数に配列を使う
この記事でやること
この記事でやること
配列を使ったプログラム
配列を使ったプログラム
バッファーの中身
バッファーの中身
文字列を使ったときの配列とバッファーの中身
文字列を使ったときの配列とバッファーの中身
日本語の文字列をchar型配列に代入したときの配列の中身
日本語の文字列をchar型配列に代入したときの配列の中身
配列の中身の表示
配列の中身の表示
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
Nodachisoft © 2020