自作関数の引数に構造体変数を用いることができます そしてmain関数内で定義された構造体変数を代入することもできます(この場合 値渡しとなります)

アレサ「自作関数をもういちど復習してみますか。


ソーラー「自作関数とは次のプログラム?


こんなのだったかな?」


#include <stdio.h>


void watchCubedata(int x){

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

}


int main(void)

{

int a=5;

watchCubedata(a);

/*変数aに格納された数値5を変数xに値渡ししています*/

return 0;

}

コンパイル結果

5


ソーラー 「このプログラムではwatchCubedataという自作関数をつくっているね。 


自作関数の内容は変数xにあたえられた数値を表示する


printf("%d\n",x);だね。


アレサ「ソーラーさん、もう少し詳しく見ていきます。


#include <stdio.h>


void watchCubedata(int x){

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

}

/*自作関数watchCubedataを定義しました。


int xでxの変数宣言を行いながら、かつ


変数xを自作関数watchCubedataの仮引数に指定しています*/


int main(void)

{

int a=5;

/*aを変数宣言し、変数aに数値5を格納しました。*/


watchCubedata(a);

/*自作関数の仮引数である変数xに

main関数内で定義された実引数aを代入しました。

これにより

watchCubedataの仮引数に5があたえられます。

*/

return 0;

}

コンパイル結果

5


アレサ「自作関数内で定義された変数xは仮引数


main関数内で定義された変数aは実引数というのでした。


仮引数と実引数の違いについてもう1ど確認されますか?」


ソーラー「仮引数と実引数・・・おねがい」


アレサ「それでは仮引数と実引数の違いを


次のプログラムで示してみたいと思います。


新たに自作関数


void watchCubedata(int x){


x=x+5;

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

}

を作成しプログラムを組むと



#include <stdio.h>


void watchCubedata(int x){

x=x+5;

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

}

/*自作関数watchCubedataを定義しました。


int xでxの変数宣言を行いながら、かつ


自作関数watchCubedataの仮引数に変数xを指定しています*/


int main(void)

{

int a=1;

/*aを変数宣言し、変数aに数値1を格納しました。*/


watchCubedata(a);

/*自作関数の仮引数である変数xに

main関数内で定義された実引数aを代入しました。

これにより

watchCubedataの仮引数に1があたえられます。

*/

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


return 0;

}

コンパイル結果

6

1


となります


このプログラムのように


   🍋自作関数内で定義された仮引数である変数xに🍋


   🍋main関数内で定義された実引数aを代入した場合🍋



🍋変数aに格納されている数値1だけが仮引数である変数xに渡されます🍋



            このように


🍋実引数である変数aから仮引数である変数xへデータを渡す方法を🍋



            🍋値渡し🍋



といいます


よって


main関数内で定義された変数aは


自作関数の操作をうけることがなく


変数aに格納されている値は

int a=1;で初期化されたa=1のままとなり


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


によって示されるaの値は1となります


watchCubedata(a);の操作により

変数aに格納されている値は6になることはありません


つまり


実引数aに格納されている数値1を仮引数xに代入しているだけなので


仮引数xに格納された数値1にいくら操作をくわえても


実引数aに格納されている数値の値は


a=1のまま


全然まった~く変化しないのでした。


仮引数と実引数の関係に関しては


この説明でよいでしょうか。」


ソーラー「そう、そう 度忘れしてた


くわしくは


値渡し 参照渡しのエピソードをみてちょうだい、だね。」


ところで


自作関数の引数に構造体変数をもちいるってどういうことかな」


アレサ「実際に


自作関数の引数に構造体変数をもちいたプログラムをみてみませんか。」


ソーラー


「そうだね。そうしてみたらわかりやすいかも。」


アレサ「こちらが そのプログラムとなります。


#include <stdio.h>


typedef struct Cube{

int no;

float tate;

float yoko;

float takasa;

}Cube;

/*struct Cubeの構造体宣言を行いながら

構造体名を struct Cube からCubeに変更しました*/


void watchCubedata(Cube a){

a.no=2*a.no;

a.tate=2*a.tate;

a.yoko=2*a.yoko;

a.takasa=2*a.takasa;

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

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

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

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

}

/*新たに自作関数watchCubedataを定義しました。


立方体につけられている

ナンバー

高さ

のデータ情報を2倍にして

printf出力表示することができる自作関数です

ここでは

Cube aでaの構造体変数宣言を行いながら

自作関数watchCubedataの仮引数として

構造体Cube型の構造体変数 aを指定しています。

この構造体変数aに

main関数内で定義された同じ構造体Cube型の構造体変数cube1を代入して構造体変数cube1が格納している数値を構造体変数aにわたしていこうというわけですね。

ポインタ変数を自作関数の引数につかって構造体変数cube1のアドレスを渡さないので 値渡しとなります。

そして ここではaの 構造体変数宣言をしただけですので

構造体変数aにはまだ構造体変数cube1は代入されていません。*/


int main(void)

{


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

/*cube1を 構造体変数宣言し、数値を格納して初期化しました。*/


watchCubedata(cube1);

/*自作関数の仮引数である構造体Cube型の構造体変数 aに

同じ構造体Cube型の構造体変数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


ソーラー「さっきのプログラムでは


自作関数の仮引数である整数の型intの変数xに


main関数内でつくられた実引数である変数a


を代入していたのが


今度のプログラムでは


自作関数の仮引数である


構造体 Cube 型の構造体変数aに


main関数内で定義された実引数である


同じ構造体 Cube 型の構造体変数cube1を


代入したというわけなんだね。


というか そういうこともできるんだね。」


アレサ「そうなんです。


そして その自作関数の引数である構造体変数aに構造体変数cube1を


代入することにより


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

a.no

a.tate

a.yoko

a.takasa

格納された数値

1

7.0

7.0

7.0

自作関数の定義

a.no=2*a.no;

a.no=2*a.tate;

a.no=2*a.yoko;

a.no=2*a.takasa;

により

2倍され


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

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

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

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

この自作関数の4つの命令文により

コマンドプロンプト画面に


printf出力表示されているわけです。」


ソーラー「このように構造体変数aを自作関数の引数につかうと


構造体変数aに構造体変数cube1を代入することにより


1度に


構造体変数cube1の4つのメンバ変数に格納されていた4つの数値を


自作関数にかけることができるね。


いい仕組みだね。😊」



🐦 🐦  🐦   🐦   🐦


 

このとき

構造体変数cube1から構造体変数aへ

値渡しがおこなわれています


自作関数の引数にポインタ変数はもちいられていませんね。


ですから構造体変数cube1のアドレスが渡されることもありません。


参照渡しではありません。


ですので


cube1の構造体変数宣言、初期化


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


により


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


cube1.no=1

cube1.tate=7.0

cube1.yoko=7.0

cube1.takasa=7.0


と数値が格納されている状態は


構造体変数cube1が


自作関数であるwatchCubedataに


watchCubedata(cube1);


このように代入されても


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


構造体変数 aに値渡しされただけで


構造体変数cube1は自作関数watchCubedataの操作を


うけることはありません


よって


構造体変数cube1に格納されている数値は


自作関数の操作をうけることはありません。


ですので

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

となります。


構造体変数cube1のメンバ変数に格納されている数値は


cube1.no=1

cube1.tate=7.0

cube1.yoko=7.0

cube1.takasa=7.0


のまま2倍とはなりません。」


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

作者を応援しよう!

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

応援したユーザー

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