🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
main関数内で定義された構造体の配列のアドレスを 自作関数の引数となっているポインタ変数に参照渡しして からmain関数内で定義された構造体の配列に格納されている数値データを変更してみましょう
main関数内で定義された構造体の配列のアドレスを 自作関数の引数となっているポインタ変数に参照渡しして からmain関数内で定義された構造体の配列に格納されている数値データを変更してみましょう
アレサ「さあ、いよいよ
main関数内で定義された構造体型の配列のアドレスを
自作関数の引数となっているポインタ変数に参照渡ししてから
main関数内で定義された構造体型の配列に格納されている数値データを変更してみましょう
にとりかかってみましょう
まずは
あるキャラクター
character1のステータスデータが
HP=10
MP=12
AP=20
DP=15
で表されているとします。
main関数内で定義された
構造体CharacterStatusDataの構造体変数charcter1StatusData
に
このcharacter1のステータスデータを格納し
自作関数をつかって
2倍にしてみます。
次のようにプログラムを構成しました。
🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻
#include <iostream>
using namespace std;
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;
cout << pta->HP << "\n";
cout << pta->MP << "\n";
cout << pta->AP << "\n";
cout << pta->TP << "\n";
}
int main()
{
CharacterStatusData charcter1StatusData={10,12,20,15};
cout << charcter1StatusData.HP << "\n";
cout << charcter1StatusData.MP << "\n";
cout << charcter1StatusData.AP << "\n";
cout << charcter1StatusData.TP << "\n";
CharacterStatusData2bai(&charcter1StatusData);
cout << charcter1StatusData.HP << "\n";
cout << charcter1StatusData.MP << "\n";
cout << charcter1StatusData.AP << "\n";
cout << charcter1StatusData.TP << "\n";
return 0;
}
ビルド実行結果
10
12
20
15
20
24
40
30
20
24
40
30
🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻
構造体変数のメンバ変数に格納された
このcharacter1のステータスデータを
今度は
main関数内で定義された
構造体の配列に格納してみます。
構造体は
typedef struct CharacterStatusData {
int HP;
int MP;
int AP;
int DP;
} CharacterStatusData
とし
構造体CharacterStatusData型の配列宣言
CharacterStatusData str[1]={10,12,20,15};
を行って数値データを格納する
配列変数str[0]のメンバ変数
str[0].HP
str[0].MP
str[0].AP
str[0].TP
を生成し
character1のステータスデータ
10
12
20
15
を
str[0].HP=10
str[0].MP=12
str[0].AP=20
str[0].TP=15
と代入します
ここで
配列変数
str[0]
は
先程のプログラムの
構造体の構造体変数charcter1StatusDataに相当し
str[0].HP
str[0].MP
str[0].AP
str[0].TP
は配列変数(構造体変数)str[0]のメンバ変数
となっています。
今回は
main関数内で
構造体CharacterStatusData型の配列宣言
CharacterStatusData str[1]={10,12,20,15};
をおこなうことにより
作製された
配列変数str[0]のメンバ変数
str[0].HP
str[0].MP
str[0].AP
str[0].TP
に
str[0].HP=10
str[0].MP=12
str[0].AP=20
str[0].TP=15
と
格納された数値データを自作関数をつかって
2倍にしてみたいというわけです
そのため
構造体変数の役割を果たしている配列変数str[0]の
メンバ変数
str[0].HP
str[0].MP
str[0].AP
str[0].TP
のアドレスデータを
自作関数の引数となっているポインタ変数に渡す
参照渡し(ポインタ渡し)
を
行いたいというわけです。
参照渡し(ポインタ渡し)をおこなうことができれば
自作関数の引数となっているポインタ変数を使って
構造体変数の役割を果たしている配列変数str[0]のメンバ変数
str[0].HP
str[0].MP
str[0].AP
str[0].TP
に
str[0].HP=10
str[0].MP=12
str[0].AP=20
str[0].TP=15
と
格納された数値をデータを
2倍にできるというわけです。
そのためには
まずは
構造体変数の役割を果たしているstr[0]の
アドレスを知っている必要があるのですが
いまのところ
よくわかりません😊
先のエピソードで
構造体と構造体変数をつかって
chzracter1のステータスデータ
HP=10
MP=12
AP=20
DP=15
を2倍にする場合は
つぎのようにプログラムが構成されていました。
🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻
#include <iostream>
using namespace std;
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;
cout << pta->HP << "\n";
cout << pta->MP << "\n";
cout << pta->AP << "\n";
cout << pta->TP << "\n";
}
int main()
{
CharacterStatusData charcter1StatusData={10,12,20,15};
cout << charcter1StatusData.HP << "\n";
cout << charcter1StatusData.MP << "\n";
cout << charcter1StatusData.AP << "\n";
cout << charcter1StatusData.TP << "\n";
CharacterStatusData2bai(&charcter1StatusData);
cout << charcter1StatusData.HP << "\n";
cout << charcter1StatusData.MP << "\n";
cout << charcter1StatusData.AP << "\n";
cout << charcter1StatusData.TP << "\n";
return 0;
}
ビルド実行結果
10
12
20
15
20
24
40
30
20
24
40
30
🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻
このプログラムでは
自作関数CharacterStatusData2baiの実行時
character1のステータスデータ
10
12
20
15
を格納している
構造体変数charcter1StatusDataのメンバ変数
charcter1StatusData.HP
charcter1StatusData.MP
charcter1StatusData.AP
charcter1StatusData.TP
のアドレスを
代表して
構造体変数charcter1StatusDataのアドレス
&charcter1StatusDataを
自作関数の引数であるポインタ変数ptaに
次のように
⇩
CharacterStatusData2bai(&charcter1StatusData);
参照渡し(ポインタ渡し)をしていました
今
character1のステータスデータ
10
12
20
15
を格納している
構造体 CharacterStatusData型の構造体変数にあたるstr[0]のメンバ変数
str[0].HP
str[0].MP
str[0].AP
str[0].TP
のアドレスを
代表しているアドレスが
何なのかわからない状態でした
そこで
構造体変数charcter1StatusDataのアドレスが
&charcter1StatusData
だったのを参考にすると
構造体 CharacterStatusData型の構造体変数にあたる
str[0]のアドレス
&str[0]が
そのメンバ変数
str[0].HP
str[0].MP
str[0].AP
str[0].TP
のアドレスを
代表していると思われます
そこで
自作関数の引数である
自作関数内で宣言されたポインタ変数ptaに
構造体の配列str[1]のアドレスであるだろう
&str[0]を
CharacterStatusData2bai(&str[0]);
のように参照渡しをしてみようと思います
構造体の配列str[1]のアドレスは
&str[1]でなく
&str[0]というわけです。
🌞ここが注意ポイントです。
CharacterStatusDataの構造体の配列宣言
CharacterStatusData str[1]={10,12,20,15};
を行うと
作製される配列変数は
str[0].HP
str[0].MP
str[0].AP
str[0].TP
になります。
ですから
str[0].HP
str[0].MP
str[0].AP
str[0].TP
を代表するアドレスは
&str[1]でなく
&str[0]となります。
つまり
CharacterStatusData str[1]={10,12,20,15};
のstr[1]の要素数は1なので
作製される配列変数のメンバ変数は
str[0].HP
str[0].MP
str[0].AP
str[0].TP
になるというわけです。
🌞 🌞 🌞
それから自作関数CharacterStatusData2baiを使って
str[0].HP
str[0].MP
str[0].AP
str[0].TP
に格納されている数値データを
2倍にしてみます
さあ、それでは😊
main関数内で定義された構造体型の配列の配列変数str[0]のメンバ変数である
str[0].HP
str[0].MP
str[0].AP
str[0].TP
のアドレスを代表するであろう&str[0]を
自作関数CharacterStatusData2baiの引数であるCharacterStatusData*のポインタ変数ptaに参照渡し(ポインタ渡し)
して
str[0].HP
str[0].MP
str[0].AP
str[0].TP
のアドレスの場所に格納されている数値データを
2倍にする
つまり
str[0].HP
str[0].MP
str[0].AP
str[0].TP
に格納されている数値データを2倍にするであろう
プログラムは次のように構成されます」
#include <iostream>
using namespace std;
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;
cout << pta->HP << "\n";
cout << pta->MP << "\n";
cout << pta->AP << "\n";
cout << pta->TP << "\n";
}
int main()
{
CharacterStatusData str[1]={10,12,20,15};
cout <<str[0].HP<<"\n";
cout <<str[0].MP<<"\n";
cout <<str[0].AP<<"\n";
cout <<str[0].TP<<"\n";
CharacterStatusData2bai(&str[0]);
cout <<str[0].HP<<"\n";
cout <<str[0].MP<<"\n";
cout <<str[0].AP<<"\n";
cout <<str[0].TP<<"\n";
return 0;
}
ビルド実行結果
20
10
12
20
15
20
24
40
30
20
24
40
30
てんC「構造体型の配列の配列変数のメンバ変数に格納されている数値データを自作関数を使って
2倍にすることに成功いたしました」
ソーラー「てんC こんな仕組みになっているんだね。
ほんと たいしたものだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます