自作関数の弱点は参照渡しを行わなければmain関数内で変数宣言された変数に格納されているデータを変更することができないことにあります

main関数内で定義された構造体変数を自作関数の引数として定義された構造体変数に代入する・・・構造体変数の値渡し  マックス達はバカンスしています

アレサ 「はい ソーラーさん


次へとすすんでいきますよ。」


ソーラー「順調じゃないかっ😝


もう この調子で


すすめるだけ 進んじゃえ\(^o^)/😆」


アレサ 「はい ソーラーさん


先ほどのプログラムを改良し


main関数内で定義された構造体変数に格納された数値データが


自作関数の引数として定義された構造体変数に値渡しされる様子を


もう1度 次のプログラムでみていきます。」


ソーラー「値渡しって前のエピソードでもでてきたやつだね。


main関数内で定義された構造体変数から


自作関数の引数として定義された構造体変数への


        🐙 値渡しに 🐙



           注目ってわけだね。」



#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;


void Cubedata2baiHyouji(Cube a){


a.no= a.no*2;

a.tate= a.tate*2;

a.yoko= a.yoko*2;

a.takasa= a.takasa*2;

/*ここでCube aに代入された


構造体変数の各メンバ変数に格納されている数値データを2倍にします。*/


printf("%d\n" ,a.no);

printf("%f\n" ,a.tate);

printf("%f\n" ,a.yoko);

printf("%f\n" ,a.takasa);

/*2倍になった数値データを表示します。*/

}


int main(void)

{


Cube cube1={1,7.0,7.0,7.0};


Cubedata2baiHyouji(cube1);


printf("%d\n" ,cube1.no);

printf("%f\n" ,cube1.tate);

printf("%f\n" ,cube1.yoko);

printf("%f\n" ,cube1.takasa);


return 0;

}

コンパイル結果

2

14.000000

14.000000

14.000000

1

7.000000

7.000000

7.000000


アレサ

「このプログラムでは


自作関数


Cubedata2baiHyouji(cube1);


の実行時


自作関数Cubedata2baiHyouji(Cube a)の引数に


main関数内で定義された


Cube型の構造体変数cube1が代入されています



このとき


実引数cube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


から自作関数の仮引数である


Cube型の構造体変数aのメンバ変数である


a.no

a.tate

a.yoko

a.takasa


に数値データ

1

7.0

7.0

7.0


が値渡しされています


つまり

構造体変数cube1の各メンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


が持っている


数値データ

1

7.0

7.0

7.0

だけが


Cube型の構造体変数aの各メンバ変数


a.no

a.tate

a.yoko

a.takasa


に代入されています


構造体変数cube1の各メンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


のアドレス情報を代表して


構造体変数cube1のアドレス&cube1を


自作関数の引数となっているCube*型のポインタ変数に


渡している

(のちのエピソードで詳しく解説されます)

つまり


参照渡ししているわけではありません


この方式は参照渡しではないですの。


自作関数の引数にCube*型のポインタ変数を設定して


構造体変数cube1のアドレスをわたさなければ


ポインタ変数を使って


構造体変数cube1のメンバ変数に格納されている数値データを


変更することはできません。


ですので


構造体変数cube1の各メンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa

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


cube1のアドレス情報&cube1を格納するための

Cube*型のポインタ変数が自作関数に

つかわれていない自作関数


Cubedata2baiHyouji(cube1);


が実行されても


影響をうけることがなく


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


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


cube1.no=1

cube1.tate=7.0

cube1.tate=7.0

cube1.tate=7.0


のままとなります


その一方で


自作関数Cubedata2baiHyouji(Cube a)の


引数であるCube型の構造体変数aの


各メンバ変数


a.no

a.tate

a.yoko

a.takasa


に渡された


🌞数値データ

1

7.0

7.0

7.0

だけは


自作関数 Cubedata2baiHyouji

《引数に代入された構造体変数の各メンバ変数の値だけを2倍にする自作関数です》


の操作により


2倍されて


コンパイル結果は

2

14.000000

14.000000

14.000000

が表示されます」


ソーラー「ははっ


アレサっ 僕にも復唱させてよ


値渡し、ポインタ渡しのことがだいぶわかってきたんだ


もう1回繰り返すと


このプログラムで注目すべき点は


↑ ↑ ↑上記のように


main関数内で


Cubedata2baiHyouji(cube1);


が実行されても


その次に記述された4つの命令文


printf("%d\n" ,cube1.no);

printf("%f\n" ,cube1.tate);

printf("%f\n" ,cube1.yoko);

printf("%f\n" ,cube1.takasa);


によって表示される

main関数内で定義された

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


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


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

1

7.0

7.0

7.0

のまま


2倍となっていないことにあります。


自作関数


Cubedata2baiHyouji(cube1);


の実行により


つまり


自作関数


Cubedata2baiHyouji(cube a);


の引数として


main関数内で定義された構造体変数cube1が代入されることにより


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


cube1.no

cube1.tate

cube1.yoko

cube1.takasa



格納している数値データは2倍になりそうなものですが・・・」


solarplexuss「私も復唱させてぇ💖



🌳🌳🌳

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

cube1.no

cube1.tate

cube1.yoko

cube1.takasa


の格納している数値データの値は2倍になりそうなものですが・・・


の意味は



まず

自作関数の定義を観察してみると

👇

void Cubedata2baiHyouji(Cube a){


a.no= a.no*2;

a.tate= a.tate*2;

a.yoko= a.yoko*2;

a.takasa= a.takasa*2;

/*ここで各メンバ変数の値を2倍しています。*/

}


👆


ここで


ChangeCubedata2bai(cube1);


が実行されると


仮引数であるCube型の構造体変数aに


ChangeCubedata2bai(cube1)



実引数cube1を代入することにより



cube1.no= cube1.no*2;

cube1.tate= cube1.tate*2;

cube1.yoko= cube1.yoko*2;

cube1.takasa= cube1.takasa*2;


が実行され


実引数cube1のメンバ変数

cube1.no

cube1.tate

cube1.yoko

cube1.takasaに格納されている値が


2倍になる


つまり


実引数である構造体変数cube1のメンバ変数に格納されている値が

2

14.000000

14.000000

14.000000


になるかも💖


しれないということですね。


ですが


そのようなことは起こりません。


なぜなら

構造体変数aには

cube1が代入されるのではなく

cube1のメンバ変数に格納されている数値データのみがわたされるので

そもそも

cube1.no= cube1.no*2;

cube1.tate= cube1.tate*2;

cube1.yoko= cube1.yoko*2;

cube1.takasa= cube1.takasa*2;

は実行されません


実引数である構造体変数cube1のメンバ変数に格納されている数値データを


仮引数である構造体変数aのメンバ変数に代入し


自作関数で 数値データだけにいくら操作を加えても


実引数である構造体変数cube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


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


cube1.no=1

cube1.tate=7.0

cube1.tate=7.0

cube1.tate=7.0

のまま変化しません


よって


printf("%d\n" ,cube1.no);

printf("%f\n" ,cube1.tate);

printf("%f\n" ,cube1.yoko);

printf("%f\n" ,cube1.takasa);


コンパイル結果は


1

7.000000

7.000000

7.000000

となります

                   solarplexussより

🌳🌳🌳



アレサ「🌳🌳🌳のなかの説明どうりですね。


ソーラーさん」


ソーラー「そう そうして


main関数内で定義された


実引数であるCube型の構造体変数cube1を


自作関数の引数として定義された


仮引数であるCube型の構造体変数aに


代入して操作を加えても


実引数である構造体変数cube1のメンバ変数


cube1.no

cube1.tate

cube1.yoko

cube1.takasa


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


変化がおきない


このような


実引数から仮引数への数値データの渡し方を


値渡しっていうんだよね。



あっ 鳥が元気に飛んでるね」


アレサ「ほんとですの。」

                   🌞



🐤~~                    

    🐧

 🐥        🐤~~


🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

           🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

        🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳                            🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

         🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

           🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

        🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳                            🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

         🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳                   🐈🐟🐟

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

           🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

        🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳            🐳                🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

         🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳  🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 

🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳🌳 


      😊?

マックス 「て、てんC ここはどこだ?」

 

てんC 「現在の位置情報 ・・・解析できません」

           \👯/ ???


マックス 「どうやら探索に熱をいれすぎたようだな」


てんC 「はい


川で児童と水遊び


神社巡り 森林浴  焼きそば販売


球技観戦  プランテーションナッツ農園栽培


シャークウォッチング・・・・・


たくさん、たくさん探索してきました」



てんC「アロ~ハ~ オ~エ~~~」

........................................................  👯



(うねるように 遠ざかって見せるてんC )


マックス 「ははっ いつのまにフラダンスをおぼえたのか・・・」

😝     


       ..... 👯⇠⇠⇠


( 近づいて見せるてんC )


てんC 「はい、 みるものが わたしにとっては


新鮮なものばかりです。」


マックス「ここらは絶景ばかりだからな。


よ~し、さらにこの理想郷の自然を旅してみるか・・・


お前の成長にも役立つだろう。」


にこっと笑うマックス。


てんC 「そうとなれば ささっ次 いきましょう(*´▽`*)次」


マックス 「やる気 まんまんだな」







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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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