関数呼出(値渡しと参照渡し) 数理情報システム工学科 担当: 汐月哲夫 2015/9/30 プログラミング方法論 [email protected] 1 値渡しと参照渡し メインプログラム 呼び出される 関数プログラム #include <stdio.h> int main( void ) { int a = 3; int b = 4; printf(“%d”,add(a,b)); return 0; } 2015/9/30 int add(int x, int y) { return x+y; } プログラミング方法論 [email protected] 2 変数宣言と初期化 int main( void ) { int a = 3; int b = 4; printf(“%d”,add(a,b)); return 0; } a 3 b 4 ・ "%d" メモリ (0) 文字列 "%d" はプログラム起動時に自動的に定数として メモリ上にその値が確保され、アドレスが確定する。 (1) int 型変数が宣言され、初期値がセットされる。 2015/9/30 プログラミング方法論 [email protected] 3 値渡し(call by value) (1)引数の並びに従って 値がコピーされる (2)計算処理がなされて 返すべき値が用意される (3)関数の値が式の 2015/9/30 値として返される 7 ・ "%d" メモリ value int main( void ) { int a = 3; int b = 4; printf(“%d”,add(a,b)); return 0; } a 3 b 4 3 x 4 y int add(int x, int y) { return x+y; } 7 プログラミング方法論 [email protected] 4 参照渡し(call by reference) 7 (1)引数の並びに従って 値とアドレスがコピーされる (2)書式指定に従って変数の 値が文字列に変換され、 STDOUT に送られる。 2015/9/30 7 "%d" value int main( void ) { int a = 3; int b = 4; printf(“%d”,7); return 0; } ・ メモリ address a 3 b 4 fmt ・ int printf(char *fmt, ... ) { stdout にデータを送る } プログラミング方法論 [email protected] 文 字 列 STDOUT 5 値渡しと参照渡し • 関数呼び出しに伴うデータの受け渡し – データの内容を渡す値渡し • (call by value) – データの格納場所を渡す参照渡し • (call by reference) 2015/9/30 プログラミング方法論 [email protected] 6 参照渡しの例( ex1-16.c ) s value address #include <stdio.h> int main( void ) { char s[81] ; double value; "3.1415" メモリ "%lf" s s gets(s); sscanf(s, "%lf", &value); printf("%f\n", value ); return 0; } "%f\n" int gets(char *s) { STDIN から文字列 を入力 } (1) gets に配列 s のアドレスを渡す (2) STDIN より文字列データを入力し 配列 s に格納する 2015/9/30 プログラミング方法論 [email protected] STDIN 7 参照渡しの例( ex1-16.c ) gets(s); sscanf(s, “%lf”, &value); printf("%f\n", value ); return 0; s value address #include <stdio.h> int main( void ) { char s[81] ; double value; "3.1415" 3.1415 ・ "%lf" s ・ &value メモリ "%f\n" int sscanf(char *s, char *fmt, ...) { 文字列 s を 浮動小数点に変換 } } (1) sscanf に配列 s , 書式指定, 変数 value のアドレスを渡す (2) 文字列データを書式指定に従って型変換し変数 value に格納する 2015/9/30 プログラミング方法論 [email protected] 8 参照渡しの例2 メインプログラム 呼び出される 関数プログラム #include <stdio.h> void set(int *, int *); int main( void ) { int a, b; set(&a, &b); printf(“%d %d\n”,a,b); return 0; } 2015/9/30 void set(int *aptr, int *bptr) { *aptr = 3; *bptr = 4; } プログラミング方法論 [email protected] 9 関数外の変数の内容を変更する(1) メインプログラム の管理するメモリ a b 呼び出される 関数プログラム void set(int *aptr, int *bptr) { *aptr = 3; *bptr = 4; } 変数のアドレスが ポインタ変数に渡される 2015/9/30 プログラミング方法論 [email protected] 10 関数外の変数の内容を変更する(2) メインプログラム の管理するメモリ a b 3 4 呼び出される 関数プログラム void set(int *aptr, int *bptr) { *aptr = 3; *bptr = 4; } ポインタ変数が指す変数に 値を代入する 2015/9/30 プログラミング方法論 [email protected] 11
© Copyright 2024 ExpyDoc