自作関数の引数にmain関数内で変数宣言された変数を代入して実行してもmain関数内で変数宣言された変数に格納されているデータを変更することはできません それは変数が構造体変数の場合でも同様です

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

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


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


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


main関数内で変数宣言された構造体変数のメンバ変数に格納されている数値データを変更することはできません


さあ 今日はこのことについて学んでみましょう


いったいど~いうことなんでしょうか?



まずは


一般に


自作関数の引数(仮引数)にmain関数内で定義された変数(実引数)を代入して


自作関数を実行したとしても


main関数内で定義された変数(実引数)に格納された値は変更されません



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

👇


#include <stdio.h>


void setHP100(int a) {


a = 100;


return;

}



/*👆自作関数setHP100の定義です キャラクターのHPを100に設定する働きがあります・・・ というかあるように見えます*/



int main(void)


{

int HP = 15;


/*👆まずはHPを15に設定しています*/


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


/*👆まずは初期化されたHP15を表示しています*/


printf("\n");


setHP100(HP);

/*👆さあ 自作関数setHP100(HP)の実行によりHPの格納している値は100に変更されるでしょうか*/


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

/*👆さあ HPの表示結果はいかに?15から100に変更されるでしょうか? */


return 0;



}


プログラムの実行結果


HP 15


HP 15


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

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



ソーラー「自作関数setHP100(HP)が


実行されても


キャラクターのHPの値は変更されません


なぜなら


setHP100(HP);


を実行したとき


自作関数 setHP100(int a)のint aに渡されているのは


        💖main関数内で定義された変数HP💖


でなく


     💖main関数内で定義された変数HPに格納されているデータ15💖


だからです


setHP100(HP);


が実行されると


自作関数setHP100の定義


void setHP100(int a) {


a = 100;


return;

}


の引数部分の


             💖int aに💖


main関数内で定義された変数HPに格納されているデータ15


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


つまり


int a=15;


が行われて


変数aが15に初期化されることになります


次に


自作関数setHP100の定義


void setHP100(int a) {


a = 100;


return;

}



a=100;


が実行されるので


変数aに格納されている値は100になります



自作関数setHP100内で定義された変数aが


100に変化した


ただそれだけのことです


main関数内で定義された変数HPに格納されているデータは15のまま変化しません


自作関数の引数に値だけが渡される値渡しの状態です






次は


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


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


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


main関数内で変数宣言された構造体変数のメンバ変数に格納されている数値データを変更することはできません


を考察してみましょう








#include <stdio.h>


typedef struct {


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


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


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


}CharacterData;




void setCharacterData(CharacterData a) {


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

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

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


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");



setCharacterData(Aresa);

/*👆自作関数setCharacterDataの引数部分のCharacter型の構造体変数aにmain関数内で変数宣言された構造体変数Aresaを代入して アレサの年齢を18から15,身長を168から160、体重を45から38に変更しようとしています・・・が・・・*/


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 (プロセス 3656) は、コード 0 で終了しました。

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



ソーラー「


自作関数


setCharacterData(Aresa);


実行されても


アレサの


年齢

身長

体重

は変化しません


なぜなら


setCharacterData(Aresa);


を実行したとき


自作関数 setCharacterData(Character a);のCharacter aに渡されているのは


        💖main関数内で定義された構造体変数Aresa💖


でなく


     💖main関数内で定義された構造体変数Aresaのメンバ変数


Aresa.age

Aresa.height

Aresa.weight



に格納されているデータ


18

168

45


だからです💖


setCharacterData(Aresa);


が実行されると


自作関数setCharacterDataの定義


void setCharacterData(CharacterData a) {


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

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

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


return;

}


の引数部分の


             💖CharacterData aに💖


main関数内で変数宣言されたCharacterData型の構造体変数


Aresa


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


つまり


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


a.age

a.height

a.weight



main関数内で定義された構造体変数Aresaのメンバ変数


Aresa.age

Aresa.height

Aresa.weight



に格納されているデータ


18

168

45


             !だけ!



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


つまり


CharacterData a={18,168,45}


が行われて初期化されることになります


次に


void setCharacterData(CharacterData a) {


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

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

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


return;

}



a.age = 15;

a.height = 160;

a.weight = 38;



が実行されるので


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


a.age

a.height

a.weight

に格納されている値は


18

168

45


から


15

160

38


になります


この場合


自作関数setCharacterData内で定義された構造体変数aのメンバ変数


a.age

a.height

a.weight

に格納されている値が


15

160

38


に変化した



ただそれだけのことです


main関数内で定義された構造体変数Aresaのメンバ変数


Aresa.age

Aresa.height

Aresa.weight



に格納されているデータは


18

168

45


のまま


変化しません



自作関数の引数に値だけが渡される値渡しの状態です





























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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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