引数に構造体変数の用いられた自作関数が実行されてもmain関数内で定義された構造体変数のメンバ変数に格納されている数値データを変更することはできません その3

さらにさらに


main関数内で変数宣言された構造体変数が


自作関数の引数部分の構造体変数宣言に代入されて


自作関数が実行されたとしても


main関数内で変数宣言された構造体変数のメンバ変数に


格納されている数値データを変更されません


ということを


さらに別のプログラムで考察してみましょう



まずは次のプログラムをご覧ください


#include <stdio.h>


typedef struct {


int age;/*キャラクターの年齢*/


int height;/*キャラクターの身長*/


int weight;/*キャラクターの体重*/


}CharacterData;



int main(void)


{


CharacterData Aresa = { 18,168,45}; /*年齢18, 身長168,体重45*/


/*👆まずはAresaのCharacterData型の構造体変数宣言と初期化を行っています*/



printf("年齢は%d才です\n", Aresa.age);

printf("身長は%dcmです\n", Aresa.height);

printf("体重は%dkgです\n", Aresa.weight);


/*👆初期化されたアレサの年齢、身長、体重を表示しています*/



return 0;


}


プログラムの実行結果


年齢は18才です

身長は168cmです

体重は45kgです


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 29576) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...



このプログラムでは


構造体CharacterData

👇

typedef struct {


int age;/*キャラクターの年齢*/


int height;/*キャラクターの身長*/


int weight;/*キャラクターの体重*/


}CharacterData;

👆

を用いることにより


アレサというキャラクターの


年齢

身長

体重


のデータを管理しています



AresaのCharacterData型の構造体変数宣言


CharacterData Aresa = { 18,168,45}; /*年齢18, 身長168,体重45*/


が実行されていますね


このCharacterData型の構造体変数Aresa


変数名Aresa



アレサというキャラクターの


年齢

身長

体重


のデータを管理するのに最適な名前ですね


CharacterData Aresa = { 18,168,45};


が実行されると


CharacterData型の構造体変数Aresaのメンバ変数


Aresa.age

Aresa.height

Aresa.weight


に数値データ


18

168

45

代入されることになります








では


自作関数をもちいて


この


アレサというキャラクターの


年齢

身長

体重


のデータを変更する



つまり


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


Aresa.age

Aresa.height

Aresa.weight


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

18

168

45


から


12

128

35


に変更するにはどうしたらよいでしょうか?


先ほどは失敗しましたが


そこのあなた


自作関数を用いて


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


Aresa.age

Aresa.height

Aresa.weight


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


18

168

45


から


12

128

35


に変更してみませんか?


どうしよっかな~



そうだ こ~んな自作関数を設定してみてはいかがでしょうか?

👇

void setCharacterData(CharacterData a, int nenrei, int sinchyou, int taijyuu) {


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/


return;

}


👆


えっ


さっきのエピソードで登場した自作関数とまったく同じ自作関数・・・ですか・・・


私なにいってるか わっかりませ~ん


えへっ


なぜ


引数に


CharacterData a

int nenrei

int sinchyou,

int taijyuu


が設定されているのでしょうか


例えばこの自作関数が用いられたプログラムは以下のようになります

👇



#include <stdio.h>


typedef struct {


int age;/*キャラクターの年齢*/


int height;/*キャラクターの身長*/


int weight;/*キャラクターの体重*/


}CharacterData;




void setCharacterData(CharacterData a, int nenrei, int sinchyou, int taijyuu) {


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/


return;

}


int main(void)


{


CharacterData Aresa = { 18,168,45}; /*年齢18, 身長168,体重45*/


/*👆まずはAresaのCharacterData型の構造体変数宣言と初期化を行っています*/



printf("年齢は%d才です\n", Aresa.age);

printf("身長は%dcmです\n", Aresa.height);

printf("体重は%dkgです\n", Aresa.weight);


/*👆まずは初期化されたアレサの年齢、身長、体重を表示しています*/



printf("\n");



int new_version_age = 12;

int new_version_height = 128;

int new_version_weight = 35;


/*👆アレサの年齢を12、身長を128、体重を35に変更するための準備としてnew_version_age new_version_height new_version_weightに12,128,35を代入しています*/


setCharacterData(Aresa,new_version_age,new_version_height,new_version_weight);

/*👆自作関数setCharacterDataを実行してアレサの年齢、身長、体重を変更しようとしていますが・・・*/


printf("年齢は%d才です\n", Aresa.age);

printf("身長は%dcmです\n", Aresa.height);

printf("体重は%dkgです\n", Aresa.weight);


/*👆変更後のアレサの年齢、身長、体重を表示しようとしています・・・が・・・*/


return 0;



}


プログラムの実行結果


年齢は18才です

身長は168cmです

体重は45kgです


年齢は18才です

身長は168cmです

体重は45kgです


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 28776) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...


ソーラー「ぜんぜん


アレサの

年齢は

18から12に

身長は

168から128に

体重は

45から35に


変更されていません


つまり


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


Aresa.age

Aresa.height

Aresa.weight


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


18

168

45


から


12

128

35


に変更されていません


setCharacterData(Aresa,new_version_age,new_version_height,new_version_weight);


が実行されると


                   まず


自作関数setCharacterDataの定義

👇

void setCharacterData(CharacterData a, int nenrei, int sinchyou, int taijyuu) {


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/


return;

}



           💖引数となっている💖


CharacterData a

Aresa


int nenrei

new_version_age


int sinchyou

new_version_height


int taijyuu

new_version_weight


が代入されるので


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/

Aresa.age=new_version_age;

Aresa.height=new_version_height;

Aresa.weight=new_version_weight;


を表すことになり


Aresa.age=new_version_age;

Aresa.height=new_version_height;

Aresa.weight=new_version_weight;


実行されることになりそう😊😊😊😊😊ですが


実際には


CharacterData a

           💖Aresaの持っているデータだけが💖


代入されることになります


つまり


CharacterData型の構造体変数aのメンバ変数


a.age

a.height

a.weight



CharacterData型の構造体変数Aresaのメンバ変数


Aresa.age

Aresa.height

Aresa.weight


の格納している値


18

168

45


が代入されることになります


つまり


a.age =18;

a.height= 168;

a.weight =45;


が実行されることになります


int nenrei

には

new_version_ageが格納している数値データ12


int sinchyou

new_version_heightが格納している数値データ128


int taijyuu

new_version_weightが格納している数値データ35


が代入されることになります



その後


自作関数setCharacterDataの定義

👇

void setCharacterData(CharacterData a, int nenrei, int sinchyou, int taijyuu) {


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/


return;

}


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/


が実行されていくことになるのですが


int nenrei

12


int sinchyou

128


int taijyuu

35


が代入されているので


a.age =12;

a.height= 128;

a.weight =35;


が実行されることになります


単に


a.age =12;

a.height= 128;

a.weight =35;


が実行されるだけなので


CharacterData型の構造体変数Aresaのメンバ変数


Aresa.age

Aresa.height

Aresa.weight


の格納している値


18

168

45



12

128

35


に変更されるようなことはありません


ですので


プログラムの実行結果に


プログラムの実行結果


年齢は18才です

身長は168cmです

体重は45kgです


年齢は18才です

身長は168cmです

体重は45kgです


が表示されることになります





















#include <stdio.h>


typedef struct {


int age;/*キャラクターの年齢*/


int height;/*キャラクターの身長*/


int weight;/*キャラクターの体重*/


}CharacterData;




void setCharacterData(CharacterData a, int nenrei, int sinchyou, int taijyuu) {


a.age = nenrei; /*キャラクターの年齢を設定しています*/

a.height = sinchyou; /*キャラクターの身長を設定します*/

a.weight = taijyuu; /*キャラクターの体重を設定します*/


return;

}


int main(void)


{


CharacterData Aresa = { 18,168,45}; /*年齢18, 身長168,体重45*/


/*👆まずはAresaのCharacterData型の構造体変数宣言と初期化を行っています*/



printf("年齢は%d才です\n", Aresa.age);

printf("身長は%dcmです\n", Aresa.height);

printf("体重は%dkgです\n", Aresa.weight);


/*👆まずは初期化されたアレサの年齢、身長、体重を表示しています*/



printf("\n");



int new_version_age = 12;

int new_version_height = 128;

int new_version_weight = 35;

setCharacterData(Aresa,new_version_age,new_version_height,new_version_weight);

/*👆アレサの年齢、身長、体重を変更しようとしていますが・・・*/


printf("年齢は%d才です\n", Aresa.age);

printf("身長は%dcmです\n", Aresa.height);

printf("体重は%dkgです\n", Aresa.weight);


/*👆変更後のアレサの年齢、身長、体重を表示しようとしています・・・が・・・*/


return 0;



}


プログラムの実行結果


年齢は18才です

身長は168cmです

体重は45kgです


年齢は18才です

身長は168cmです

体重は45kgです


C:\Users\solar\source\repos\Project2\Debug\Project2.exe (プロセス 28776) は、コード 0 で終了しました。

このウィンドウを閉じるには、任意のキーを押してください...





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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