ここから本文です

C言語の関数呼び出しに関する質問です。 関数を呼び出す際に、実引数に"&"を付...

x0617_k0915_loveさん

2007/7/2217:32:23

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);
}

閲覧数:
5,423
回答数:
3
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

uri_pikaさん

編集あり2007/7/2220:04:29

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/25 21:11:38

降参 何とか解決できました♪
御丁寧な回答ありがとうございました☆

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

このQ&Aで解決しましたか?質問する

閉じる

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

shogyo_mujyoさん

編集あり2007/7/2301:37:06

実引数が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をつけるなどして区別すると間違いが減ります)

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

kota02212000さん

2007/7/2217:41:07

C言語で変数の前に&がついている場合その変数のアドレスを示します。
つまり、呼び出す関数内においてポインタを用いた処理を行いたいときは
変数のアドレスを渡す必要があるので変数の前に&をつけてアドレスを渡します。

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する