天国にいけるC言語入門 ヘキサ構造体 ver5.2130
main関数内で定義された構造体変数に1人のゲームキャラクターのデータを格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます
構造体の配列のアドレスをポインタ渡しすることにより複数のゲームキャラの位置、ステータスデータを構造体だけを使った場合より簡単に変更することができます ここでその仕組みを学んでいきましょう
main関数内で定義された構造体変数に1人のゲームキャラクターのデータを格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます
ここに
ゲームキャラクターcharcter1が4つのステータスデータ
HP=10
MP=8
AP=22
TP=18
をもっているとします
この4つのステータスデータを
CharacterStatusDataの構造体宣言をおこなって
構造体CharacterStatusDataを作製
さらに
character1StatusDataの構造体CharacterStatusData型の構造体変数宣言
CharacterStatusData character1StatusData;
をおこなって
構造体変数character1StatusData
を作製し
作製された
構造体変数character1StatusDataのメンバ変数に格納するプログラムは次のようになります
#include <stdio.h>
typedef struct CharacterStatusData
{
int HP;
int MP;
int AP;
int TP;
}CharacterStatusData;
int main(void){
CharacterStatusData character1StatusData;
/* player1の4つのデータ
HP=10
MP=8
AP=22
TP=18
を
character1StatusDataのメンバ変数
character1StatusData.HP
character1StatusData.MP
character1StatusData.AP
character1StatusData.TP
に格納するために
character1StatusDataの構造体CharacterStatusData型の構造体変数宣言
をおこないました。*/
character1StatusData.HP=10;
character1StatusData.MP=8;
character1StatusData.AP=22;
character1StatusData.TP=18;
/* character1のステータスデータを
構造体変数character1StatusDataのメンバ変数に代入しました。*/
printf("%d\n",character1StatusData.HP);
printf("%d\n",character1StatusData.MP);
printf("%d\n",character1StatusData.AP);
printf("%d\n",character1StatusData.TP);
return 0;
}
コンパイル結果
10
8
22
18
アレサ「ゲームキャラクターcharcter1のステータスデータ
10
8
22
18
を
構造体変数character1StatusDataのメンバ変数
character1StatusData.HP
character1StatusData.MP
character1StatusData.AP
character1StatusData.TP
に格納することができました
つづいて
main関数内で定義された
構造体変数character1StatusDataのメンバ変数に格納された
character1の全てのステータスデータを2倍にしてみます
自作関数をもちいて
main関数内で定義された
構造体変数のメンバ変数
character1StatusData.HP
character1StatusData.MP
character1StatusData.AP
character1StatusData.TP
に格納されている数値データを変更するには
自作関数の引数にポインタ変数を用いて
構造体変数character1StatusDataのアドレスを代入する
参照渡し(ポインタ渡し)をおこないます。
#include <stdio.h>
typedef struct CharacterStatusData
{
int HP;
int MP;
int AP;
int TP;
}CharacterStatusData;
void CharacterStatusData2bai(CharacterStatusData* pta){
pta->HP=2*pta->HP;
pta->MP=2*pta->MP;
pta->AP=2*pta->AP;
pta->TP=2*pta->TP;
/*
void CharacterStatusData2bai(CharacterStatusData* pta)
👆
このような
自作関数(ポインタ変数宣言)
の表記方法はmain関数内で定義された変数のアドレスを
自作関数の引数に参照渡し(ポインタ渡し)するのに必要な表記法でしたね。
後にmain関数内で定義される構造体変数charcter1StatusDataのアドレス&charcter1StatusDataを格納するために
ptaの構造体CharacterStatusData*型のポインタ変数宣言
CharacterStatusData* pta
を自作関数の()内で
行っています
構造体変数charcter1StatusDataのアドレスをポインタ変数ptaに渡すことにより
構造体変数charcter1StatusDataのメンバ変数のアドレス情報が
ポインタ変数ptaに渡されることになります
このとき
構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリに
格納されている数値データは
ポインタ変数ptaを使って
pta->HP
pta->MP
pta->AP
pta->TP
と表されます
構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリ
に格納されている数値データは
ポインタ変数ptaを使って
pta->HP
pta->MP
pta->AP
pta->TP
と表されます
構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリ
に格納されている数値データは
pta->HP
pta->MP
pta->AP
pta->TP
であり
pta->HP
pta->MP
pta->AP
pta->TP
に操作を加えることにより
構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリに
格納されている数値データを
変更することができるようになります
ここでは
pta->HP=2*pta->HP;
pta->MP=2*pta->MP;
pta->AP=2*pta->AP;
pta->TP=2*pta->TP;
と
構造体変数charcter1StatusDataのメンバ変数のアドレスのメモリに
格納されている数値データを
2倍になるよう自作関数を定義しています
*/
printf("%d\n" ,pta->HP);
printf("%d\n" ,pta->MP);
printf("%d\n" ,pta->AP);
printf("%d\n" ,pta->TP);
}
int main(void)
{
CharacterStatusData charcter1StatusData={10,8,22,18};
/*charcter1StatusDataの構造体変数宣言を行います*/
printf("%d\n" ,charcter1StatusData.HP);
printf("%d\n" ,charcter1StatusData.MP);
printf("%d\n" ,charcter1StatusData.AP);
printf("%d\n" ,charcter1StatusData.TP);
CharacterStatusData2bai(&charcter1StatusData);
/*main関数で定義された構造体変数charcter1StatusDataの
アドレス&charcter1StatusDataを
自作関数CharacterStatusData2baiの引数である
CharacterStatusData* pta(ポインタ変数pta)に代入して参照渡し(ポインタ渡し)を行います*/
printf("%d\n" ,charcter1StatusData.HP);
printf("%d\n" ,charcter1StatusData.MP);
printf("%d\n" ,charcter1StatusData.AP);
printf("%d\n" ,charcter1StatusData.TP);
/*
CharacterStatusDataのメンバ変数のアドレスが
自作関数の引数となっているポインタ変数に参照渡し(ポインタ渡し)されることにより
CharacterStatusDataのメンバ変数
の格納している数値データが
自作関数の操作を受け
2倍になっているかどうかを
この4つのprintf命令文で確認しています。*/
return 0;
}
コンパイル結果
10
8
22
18
20
16
44
36
20
16
44
36
ソーラー「アレサ🌞 やったね!\(^o^)/」
アレサ「はい すこし 今のプログラムはコメント文がおおかったので
長くなっています
コメント文を削除してみますと😊
#include <stdio.h>
typedef struct CharacterStatusData
{
int HP;
int MP;
int AP;
int TP;
}CharacterStatusData;
void CharacterStatusData2bai(CharacterStatusData*pta){
pta->HP=2*pta->HP;
pta->MP=2*pta->MP;
pta->AP=2*pta->AP;
pta->TP=2*pta->TP;
printf("%d\n" ,pta->HP);
printf("%d\n" ,pta->MP);
printf("%d\n" ,pta->AP);
printf("%d\n" ,pta->TP);
}
int main(void)
{
CharacterStatusData charcter1StatusData={10,8,22,18};
printf("%d\n" ,charcter1StatusData.HP);
printf("%d\n" ,charcter1StatusData.MP);
printf("%d\n" ,charcter1StatusData.AP);
printf("%d\n" ,charcter1StatusData.TP);
CharacterStatusData2bai(&charcter1StatusData);
printf("%d\n" ,charcter1StatusData.HP);
printf("%d\n" ,charcter1StatusData.MP);
printf("%d\n" ,charcter1StatusData.AP);
printf("%d\n" ,charcter1StatusData.TP);
return 0;
}
コンパイル結果
10
8
22
18
20
16
44
36
20
16
44
36
随分短くなりますの😊」
ソーラー
「main関数内で定義された構造体CharcterStatusData型の構造体変数charcter1StatusData
のメンバ変数に格納されている
ゲームキャラクターcharcter1のステータスデータ
HP=10
MP=8
AP=22
TP=18
を2倍にすることができたね。
これでゲーム内の
ゲームキャラクター
charcter1のステータスデータ
は2倍になるってわけだ」
アレサ「はいっ
ここでは構造体変数charcter1StatusDataのアドレスを
自作関数の引数として参照渡し(ポインタ渡し)をすることにより
ゲームキャラクターcharcter1の4つのステータスデータ
を2倍にすることができました。」
つづく
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます