自作関数の引数に構造体変数を用いることができます そして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の仮引数xに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の仮引数に変数xの格納している数値データ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にわたしていこうというわけですね。

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

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

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


int main(void)

{


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

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


watchCubedata(cube1);

/*自作関数watchCubedataの仮引数である構造体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.tate=2*a.tate;

a.yoko=2*a.yoko;

a.takasa=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つの命令文により

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

2

14.000000

14.000000

14.000000

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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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