DAVID J·マラン:それではでプログラムを書いてみましょう その我々の値を交換しよう 2つの変数xとy。 事前に、私は多くを書きました すでにこのプログラムの。 まず、私は、変数、Xを宣言し、 そして、その中に1の値を格納します。 それから私は、変数yを宣言し、 その中に値2を格納します。 それから私は、表示するprintf関数を続行 これらの2つの変数の値。 それから私は別のprintfと主張 これらの変数を交換することができる。 それから私は、スワップと呼ばれる関数を呼び出します。 そして私は、変数と主張している 入れ替わっている。 そして私はプリントアウトすることが、私が主張 xおよびyの新しい値である。 今、この関数はスワップとは何でしょうか? それは、C.に付属しているものではありません 確かに、私たちは私の上部のを見れば ファイルには、私が宣言したことに気づくでしょう この関数スワップのプロトタイプ それは2つのintを取ることを指定して、 任意に、AとBと呼ばれ、この この関数は何も返しません。 だから、おそらく、それは言うことない スワップのaとbの値の。 さあスワップを実装してみましょう。 まず、私は一時的に宣言するつもりだ 変数とそれに割り当て の値が、しかし私はちょうどでし として容易bに格納される。 私はその後、値を変更するつもりです Bのそれと等しくなるようにする。 した後、最後に、私は変更するつもりだ bの値はどのようなものだったが、あるであることが 今TEMPに。 今私は私が何をやったか主張 論理的に正しいです。 私は、一時的な変数に格納されました その後、B型のようにするの値を変更し、 のが何であったかであると、Bの値を変更しました。 しかし、ときに私はこれをコンパイルして実行 このプログラムは、私はそれがありません心配 私が見たものだろう。 ありませんが、スワップを行いません。 ドットスラッシュ、無交換。 そして、残念ながら、printf関数によると、 xとyの値は、偶数 私たちは、スワップであると主張した後 彼らはまだ1と2です。 今、これはなぜですか? まあ、それは、メインでは、ときに我々が判明 を渡し、この関数はスワップを呼び出す xとyを引数として、実際の xとyのコピー スワップに渡されます。 すなわち、それらの値1と2は aとbのように、スワップに合格しました。 そして、それは我々が最終的にだとBの 主にスワップ。 すなわち、2が1になり、1が2になる、である。 しかしスワップに戻り値がないため、 それは、xのコピーを受信したため そして、Y、それの動作があります xとyには影響ありません。 確かに、AとBは、いわば、スコープされ、 xとyが残っているのに対し、スワップする 主にスコープ。 だから我々は問題を抱えている。 しかし、どのようにそれを修正するには?