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};


CharacterStatusData2bai(&charcter1StatusData);


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

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);


return 0;

}

コンパイル結果

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].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].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].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};


CharacterStatusData2bai(&charcter1StatusData);


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

printf("%d\n" ,charcter1StatusData.MP);

printf("%d\n" ,charcter1StatusData.AP);

printf("%d\n" ,charcter1StatusData.TP);


return 0;

}

コンパイル結果

20

24

40

30

20

24

40

30


🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻🌻


このプログラムでは


character1のステータスデータ

10

12

20

15

を格納している


構造体変数charcter1StatusDataのメンバ変数


charcter1StatusData.HP

charcter1StatusData.MP

charcter1StatusData.AP

charcter1StatusData.TP

のアドレスを


代表して


構造体変数charcter1StatusDataのアドレス


&charcter1StatusDataを


自作関数の引数であるポインタ変数ptaに


次のように

CharacterStatusData2bai(&charcter1StatusData);


ポインタ渡しをしていました



character1のステータスデータ

10

12

20

15

を格納している


構造体の構造体変数にあたるstr[0]のメンバ変数


str[0].HP

str[0].MP

str[0].AP

str[0].TP


のアドレスを


代表しているアドレスが


何なのかわからない状態でした


そこで


構造体変数charcter1StatusDataのアドレスが


&charcter1StatusData


だったのを参考にすると


さきほどの構造体の構造体変数にあたる


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


になるというわけです。




🌞  🌞  🌞




それから自作関数を使って


str[0].HP

str[0].MP

str[0].AP

str[0].TP

に格納されている数値データを


2倍にしてみます


さあ、それでは😊


main関数内で定義された構造体の配列のメンバ変数である


str[0].HP

str[0].MP

str[0].AP

str[0].TP


のアドレスを代表するであろう&str[0]を


自作関数の引数であるポインタ変数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};


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;

}

コンパイル結果

20

24

40

30

20

24

40

30


アレサ「構造体の配列に格納されている数値を自作関数を使って


2倍にすることに成功いたしました」


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


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





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

作者を応援しよう!

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

応援したユーザー

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