思い出してください: ポインタは、メモリ内の位置を含む整数です。
これ:
int a, b;
...
a = b;
'b' 用に予約されたメモリ位置に格納された整数を、'a' 用に予約されたメモリ位置にコピーします。
これ:
int *a, b;
...
a = &b;
「b」の位置を「a」に格納します。これに続いて:
*a = 42;
変数「b」である「a」に格納されているメモリ位置に 42 を格納します。
それでは、コードを見てみましょう。これ:
void numChange(int *x,int *y)
'numChange' が 2 つのポインタ、つまりメモリ アドレスで呼び出されることをコンパイラに伝えます。この部分:
*x = 99;
*y = 77;
次に、'x' と 'y' で指定された位置に 2 つの整数を格納します。
電話すると:
numChange(10,15);
引数はメモリ位置ではなく整数です。ただし、内部では、メモリ位置も整数であるため、コンパイラは引数をポインターに変換します。効果的に、それはこれをやっています:
numChange((int *)10, (int*)15);
(これが発生した場合は、警告を発行する必要があります。これは、ほとんど良い考えではありませんが、実行されます。)
基本的に、「numChange」への呼び出しは、メモリ アドレス 10 と 15 に整数変数があることを伝え、「numChange」はそれらのメモリ位置に整数を保持して格納します。
これらの場所には (私たちが知っている) 変数がないため、このコードは実際には他のデータをどこかで上書きします。
一方、このコード:
int a=10;
int b=15;
numChange(&a,&b);
2 つの整数変数を作成し、メモリ内のそれらのアドレスを 'numChange' に渡します。ところで、実際にそれらを初期化する必要はありません。これも機能します:
int a, b;
numChange(&a,&b);
重要なのは、変数が作成され (そしてコンパイラがそれらのために RAM を確保し)、変数の位置が 'numChange' に渡されることです。
(余談ですが、変数は常に RAM に格納されているものとして扱っています。変数をこのように考えても問題ありませんが、最新のコンパイラは、パフォーマンス上の理由から、可能な限り変数を CPU レジスタに格納しようとし、必要に応じて変数を RAM にコピーして戻します。 .)