RISTイブニングスクール (応用編:第3日B)

関数呼出(値渡しと参照渡し)
数理情報システム工学科
担当: 汐月哲夫
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