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倍にすることに成功いたしました」


ソーラー「アレサ おめでとう~~~~~😊/


ほんと たいしたものだね」





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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