参照渡し(ポインタ渡し)は ゲームキャラクターが移動することやゲームキャラのHPやMPの値が変化することと関係しています
参照渡し(ポインタ渡し)は
ゲームキャラクターが移動することやゲームキャラのHPやMPの値が変化することと関係しています
🌞 🌞 🌞
ソーラー「今日は そのことについて考察してみようっ アレサ!」
ソーラー「ようは
ゲームキャラのHPを自作関数を使って増加させてみればいいんだね」
ソーラー「まずは参照渡し(ポインタ渡し)でなく
値渡しの方法を
使ってみて、ゲームキャラのHPの変化をみてみよっかな」
アレサ「はいっ
ここで 自作関数
ソーラー「自作関数
アレサ「はいっ自作関数
実行されると ゲームキャラのHPが約25%増加されるのです」
ソーラー「いいね! ゲームプログラミング解説らしくなってきたじゃないか」
アレサ「それでは
自作関数
#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のまま変化していません
これは すなわち
ゲームキャラの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より
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます