参照渡し(ポインタ渡し)は ゲームキャラクターが移動することやゲームキャラの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に

main関数内で定義された変数HPを代入し数値データ125を値渡しします

*/

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

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

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

*/


return 0;

}

コンパイル結果

156

125


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


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


変数HPを代入して


Heal(HP);

を実行しても



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


125が


int xに

渡されるだけで


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


x = x*1.25;


の影響を受けず


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


1番最後の命令文


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


のコンパイル結果


125をみてわかるよね。


それに対し


自作関数の定義


void Heal(int x){


x=x*1.25;

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

}



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


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


つまり


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


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


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


125から125のまま変化していません



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のアドレス&HPを格納したポインタ変数ptHPを代入しました

*/

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

return 0;

}


コンパイル結果

156

156



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


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


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


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


ゲームキャラのHPが


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


Healがかかったね。


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


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


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


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


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


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


参照渡し(ポインタ渡し)が使われると


値渡しの時と違って


自作関数を使って


ゲームキャラの位置や


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




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

このように


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


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


をあらわします。


この場合は


int HP=125;


が実行されているので


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


つまり


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


ところで


自作関数Healの定義の


*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型に格納されることになり


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





                   solarplexussより



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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