天国にいけるC言語入門 ヘキサ構造体 ver2.2126
引数に構造体変数の用いられた自作関数が実行されてもmain関数内で定義された構造体変数のメンバ変数に格納されている数値データを変更することはできません
自作関数の引数に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
のまま
変化しません
自作関数の引数に値だけが渡される値渡しの状態です
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます