構造体の配列のアドレスをポインタ渡しすることにより複数のゲームキャラの位置、ステータスデータを構造体だけを使った場合より簡単に変更することができます ここでその仕組みを学んでいきましょう

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倍にすることができました。」


                      つづく

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る