解決済みのQ&A
C言語の関数呼び出しに関する質問です。 関数を呼び出す際に、実引数に"&"を付け...
C言語の関数呼び出しに関する質問です。
関数を呼び出す際に、実引数に"&"を付ける場合と、付けない場合がありますが、その理由はなんですか??
C言語初心者なので、出来れば分かりやすい回答をお願いします!!
- 補足
- 質問内容と異なるかもしれませんが…
下記のプログラムを動かしたいのですが上手く動きません。
どこを直せばいいんでしょうか?
#include <stdio.h>
void Input(float a,float b)
{
printf("aの値を入力してください。=> ");
scanf("%f",&a);
printf("bの値を入力してください。=> ");
scanf("%f",&b);
}
void Calculate(float a,float b)
{
printf("\n a -> %f\n b -> %f",a,b);
}
void main(void)
{
float a,b;
Input(a,b);
Calculate(a,b);
}
-
- 質問日時:
- 2007/7/22 17:32:23
-
- 解決日時:
- 2007/7/25 21:11:38
-
- 回答数:
- 3
-
- お礼:
- 知恵コイン
- 25枚
-
- 閲覧数:
- 4,663
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
uri_pikaさん
Input関数で入力値をもらって、Calculate関数で計算をしたいのだと思います。
グローバル変数を使わない、という前提で修正すると、Input関数はfloatのポインタを引数に取らないといけません。
普通にa,bと渡すと、Input関数にはa,bの変数のコピーがわたります。
ですので、a,bをInputに渡してもmain関数に戻った際に、main内の本来のa,bとなり、このプログラムのままですと、変数には値が入っていないので、Calculateの演算結果が不定となっています。
アドレスを渡すと、関数ではそのアドレスに対して演算を行いますので、こちらを使います。
宣言は
void Input(float *a,float *b)
呼び出しには
Input(&a, &b);
としてやります。
・・・わかりましたかね?
追加:
うっかりしてました。
上記2点を直しただけでは正しい動作はしません。
Input関数の引数はポインタになっているので、scanfの引数を・・・自分で考えてみてください。
あと、Input関数の引数はポインタなので、引数は
Input(float *pa, float *pb)のように「ポインタ」であることが一目でわかるようにした方が可読性が上がると思います。
あと、わかりづらかったらこのページも参照してみてください
http://wisdom.sakura.ne.jp/programming/c/c31.html
- 編集日時:2007/7/22 20:04:29
- 回答日時:2007/7/22 19:36:22
このQ&Aはまだナイス!されていません。
役に立ったと思った回答に、ナイス!してみよう!
ベストアンサー以外の回答
(2件中1〜2件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
実引数がaとして、実際の動作時にアドレス10000として数値に100が入っている場合、
(場所) (中身)
10000:100
のようになっています。
ここで、func(a)のように呼び出すと、動作的には関数が呼び出される時に確保された
場所に100が入っている状態です。この場合、aの格納場所である10000は関数からは
わからないので、貰った数値の100を利用することはできても、現在aにはいっている100を
変更することはできません。
ところが、ここでfunc2(&a)のように呼び出すと、aの格納場所である10000が関数に渡ります。
関数側では、もらったアドレス10000に格納されている値を変更できますし、アドレスにある数値
の100を利用する事もできます。
①通常で呼び出し→その数値だけを利用したい場合
②番地で呼び出し→その数値を変更したりして呼び出し元にフィードバックしたい場合
-------------------------------------------------------
関数で宣言されたa,bは渡した元のa,bではありません。
どこかで確保された場所にaの数値とbの数値が入っているだけです。
例のように、呼び出し元のa,bを変更したい場合には②の方法を使います。
void Input(float a,float b) → void Input(float *pa,float *pb)
Input(a,b); → Input(&a, &b);
他は適宜修正してください。
(実数とポインタは紛らわしいので、ポインタはpをつけるなどして区別すると間違いが減ります)
- 編集日時:2007/7/23 01:37:06
- 回答日時:2007/7/23 01:03:11
C言語で変数の前に&がついている場合その変数のアドレスを示します。
つまり、呼び出す関数内においてポインタを用いた処理を行いたいときは
変数のアドレスを渡す必要があるので変数の前に&をつけてアドレスを渡します。
- 回答日時:2007/7/22 17:41:07
あなたにおすすめの解決済みの質問
- エクセルのオートフィルについて=indirect(""&column()&"!d"&row()+103) 上記の式でオートフィルで下に...
- sumif($b$3:$d$31,d37,$d$3:$d$31)の意味を教えてください。 よろしくお願いします
- excelでvlookupエラーの値を0、表示を非表示にする方法を教えて下さい。空白セルにするのではなく0を入...
あなたにおすすめの知恵ノート
- なぜポインタを使うのか?
- 配列と文字列とポインタ

質問した人からのコメント
御丁寧な回答ありがとうございました☆