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