scanf()
は、変数自体ではなく、書き込む変数のアドレスをとります。ここで
が何をしたいです:ボンネットの下に
scanf("%f", &website);
、アドレスおよび整数はほとんど同じです。それらは実装に基づいて異なりますが、終わりにはどちらも長さの数字です。長さは違うかもしれませんが、数字だけです。だからこそ、コンパイラはあなたに叫んでいません。あなたはおそらくこれをしたくないと知っていますが、それはあなたが何をやっているかを知っていることを信じていて、とにかくそれをやり遂げることを信じています。
アドレスは、メモリ内の何らかの場所です。 C関数は何かのアドレスを取得し、そこに行き、変更してから、呼び出し元の関数がそのアドレスに戻ることを可能にします(呼び出し元の関数は既に知っています)。ほとんどの新しい言語では、データを渡して戻すことで元の状態に戻すことができますが、Cはあまりそれをしたくないので、アドレスがあります。
壊れたレコードプレーヤー(変更したい変数)があるとします。より新しい言葉では、あなたは修理師(機能)を見に行き、彼にレコードプレーヤー(パラメータとして渡す)を与え、次に彼はあなたに固定レコードプレーヤーを与え、あなたは退去すると言うでしょう。 Cはレコードプレーヤー全体を拾うことはできません。 Cが運ぶことができるのは、その上に住所が記載されたPost-Itノートです。だから、Cがやっていることは、レコードプレーヤーが付箋の上にいる住所の修理士に行きます。修理士は家に帰ってレコードプレーヤーを修理し、電話を受けた人に戻ってきて、どうやって行ったのかを言う。レコードプレーヤーを入手するために、呼び出し元は家に戻ってそれを使用して固定します。
アドレスはアドレスで、レコードプレーヤーは変数の値です。 scanf()
は住所を求めているので、その番号を家に入れて後でそれを入手することができます。あなたはそれに変数を与えました。あなたはそれをレコードプレーヤーに渡しました。修理師(機能)は付箋を期待しているので、レコードプレイヤーに書き込まれた住所をどこかで見つけようとします。彼はシリアル番号を見つけ、その住所を探して町を回って行く。もちろん、そのようなアドレスはありません。彼はただ永遠に見渡して、渇きで亡くなります。プログラムがクラッシュします。
短いストーリーは、scanf()
にアドレスを付けます。
また、float
を使用する必要はありません。 int
で十分です。
'のscanf( "%fを"、ウェブサイト);' - > 'のscanf( "%fを"、&ウェブ);'。 BTWは 'float'の代わりに' double'または 'long int'を使います。 – BLUEPIXY
32463774はfloatではありません – user3078414
1)コンパイラの警告を有効にする、2)関数のマニュアルを読む、3)関数の既存の使用例を探します。 –