ポインタ渡しは ゲームキャラクターが移動することやゲームキャラのHPやMPの値が変化することと関係しています 

             ポインタ渡しは


ゲームキャラクターが移動することやゲームキャラのHPやMPの値が変化することと関係しています 


        🌞    🌞    🌞


ソーラー「今日は そのことについて考察してみようっ アレサ!」


ソーラー「ようは


 ゲームキャラのHPを自作関数を使って増加させてみればいいんだね」



ソーラー「まずはポインタ渡しでなく



           値渡しの方法を



使ってみて、ゲームキャラのHPの変化をみてみよっかな」


アレサ「はいっ  


ここで 自作関数Healヒールをご用意致しましたの。


ソーラー「自作関数Healヒール🌞?」


アレサ「はいっ自作関数Healヒールとは


実行されると ゲームキャラのHPが約25%増加されるのです」


ソーラー「いいね! ゲームプログラミング解説らしくなってきたじゃないか」


アレサ「それでは 


自作関数Healヒールを用いたプログラムを構成してみます。

 


#include <stdio.h>


void Heal(int x){


x=x*1.25;

printf("%d\n" ,x);

}

/*自作関数Healを定義しました。


int xでxの変数宣言を行いながら、かつ


変数xを自作関数Healの引数(つまり、仮引数)に指定しています*/


int main(void)

{

int HP=125;

/*HPを変数宣言し、変数HPに数値125を格納しました。*/


Heal(HP);

/*自作関数の仮引数である変数xに

変数HPを代入し数値125を値渡しします

*/

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

/*このときmain関数内で定義された変数HPの値は

どう表示されるでしょうか?

*/


return 0;

}

コンパイル結果

156

125


ソーラー「やっぱり 値渡しの方法だと


自作関数の引数となっているint xに


Heal(HP);


変数HPを代入しても


main関数内で変数宣言された変数HPの格納している数値


125が渡されるだけで


main関数内で変数宣言された変数HPは自作関数Healの操作


x = x*1.25;


を受けず


変数HPに格納されている値は125のまま変化しないのが


1番最後の命令文


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


のコンパイル結果


125をみてわかるよね。


それに対し


自作関数の定義


void Heal(int x) {


x = x*1.25;

cout << x << "\n";


}



cout << x << "\n";


によって表示される値は156になっています。


つまり


変数xという名前の付けられたメモリに格納された数値は


125から156に変更されているのです。


HealヒールがかかってもHPが増加してない


これは すなわち 


ゲームキャラのHPを表示する


命令文printf("%d\n" ,HP);


を実行しても


ゲーム画面内のステータス画面で


つねに


HPは125を示していることになるんだ  ははは


ある意味 無敵だね💖


アレサ  今度は



           ポインタ渡しの方法を使って



ゲームキャラのHPを増加させてみようよ🌞」


アレサ「はい


今度はポインタ渡しですので


自作関数の定義を

void Heal(int x){

x=x*1.25;

printf("%d\n" ,x);

}


から


ポインタ変数を使った

void Heal(int *ptx){

*ptx=*ptx*1.25;

printf("%d\n" ,*ptx);

}


に変更してみます


そのプログラムは次のようになりますの。


#include <stdio.h>


void Heal(int *ptx) {


*ptx = *ptx*1.25;

printf("%d\n", *ptx);

}

/*自作関数Healを定義しました。


int *ptxでptxのポインタ変数宣言を行いながら、かつ


ポインタ変数ptxを自作関数Healの引数に指定しています*/


int main(void)

{

int HP = 125;

/*HPを変数宣言し、変数HPに数値125を格納しました。*/


int *ptHP;

ptHP = &HP;

/* ptHPをポインタ変数宣言し、変数HPのアドレスをptHPに格納しました。*/

Heal(ptHP);

/*自作関数の仮引数であるポインタ変数ptxに

main関数内で変数宣言された

変数 HPのアドレスを格納したポインタ変数ptHPを代入しました

*/

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

return 0;

}


コンパイル結果

156

156



ソーラー「1番最後の命令文


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


のコンパイル結果をみてもわかるように


main関数内で変数宣言された変数HPの値が自作関数の操作を受けて


ゲームキャラのHPが


125から156に増加しているね。


Healがかかったね。


このようにポインタ渡しをつかえば


ゲームキャラのステータス画面に表示される


HPの値も156になるわけだね アレサ」


アレサ「はいっそうなりますの。


ゲームキャラも喜んでいますの」


ソーラー「喜んでる!、喜んでる?


ポインタ渡しが使われると


値渡しの時と違って


自作関数を使って


ゲームキャラの位置や


ステータスデータを変更できるんだね」




🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

このように


ポインタ変数ptxにHPのアドレスが代入されると


*ptxはHPのアドレスの場所のメモリに格納されている値


をあらわします。


この場合は


int HP=125;


が実行されているので


HPのアドレスの場所のメモリに格納されている数値


つまり


*ptxに格納されている数値は125になります。


それが


自作関数の定義の


*ptx=*ptx*1.25により


*ptxに格納される値は


125×1.25倍=156.25になりそうですが


*ptxはint型の変数aのアドレスのメモリに格納されている


数値なので


156.25の0.25はint型の変数aのアドレスのメモリに格納されず


*ptxのもつ値は


*ptx=156となります。


もともと


ptxのポインタ変数宣言int *ptxにより


作成されるポインタ変数ptxは


int型の変数のアドレスを格納するポインタ変数なのでしたね.


int型の変数のアドレスを格納しているので


*ptxはint型の変数のアドレスのメモリに格納されている数値を


あらわすことになります。


*ptxに格納される数値はint型に格納されることになり


整数値しか格納できないというわけです。





                   solarplexussより



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

作者を応援しよう!

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

応援したユーザー

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