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

main関数内で定義された構造体変数に1人のゲームキャラクターのデータを格納し自作関数の引数に構造体変数のアドレスをポインタ渡ししてから自作関数によって構造体変数に格納されているデータを変更してみます


ここに


ゲームキャラクターcharcter1が4つのステータスデータ

HP=10

MP=8

AP=22

TP=18


をもっているとします


この4つのステータスデータを


CharacterStatusDataの構造体宣言をおこなって


構造体CharacterStatusDataを作製


さらに

character1StatusDataの構造体変数宣言


CharacterStatusData 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の構造体変数宣言をおこないました。*/


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のアドレスを格納するために


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の構造体変数宣言を行います*/


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;

}


コンパイル結果

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


CharacterStatusData2bai(&charcter1StatusData);


printf("%d\n" ,charcter1StatusData.HP);

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);


return 0;

}


随分短くなりますの😊」




ソーラー


「main関数内で定義された構造体CharcterStatusData型の構造体変数charcter1StatusData


のメンバ変数に格納されている


ゲームキャラクターcharcter1のステータスデータ


HP=10

MP=8

AP=22

TP=18


を2倍にすることができたね。


これでゲーム内の


ゲームキャラクター

charcter1のステータスデータ


は2倍になるってわけだ」


アレサ「はいっ


ここでは構造体変数charcter1StatusDataのアドレスを


自作関数の引数としてポインタ渡しをすることにより


ゲームキャラクターcharcter1の4つのステータスデータ


を2倍にすることができました。」


                      つづく

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

作者を応援しよう!

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

応援したユーザー

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