1

なぜこのプログラムは、a と b を初期化するときにしか機能しないのですか。a と b を初期化せずに渡したい、たとえば:

numChange(10,15);

これは可能ですか?

#include <iostream>
using namespace std;
void numChange(int *x,int *y)
{
     *x = 99;
     *y = 77;
}

int main()
{
    numChange(10,15);
    //int a=10;
    //int b=15;
    //numChange(&a,&b);
    cout<<a<<" , "<<b<<endl;

    return 0;
}
4

2 に答える 2

3

ポインターを受け取るように関数を定義したためですが、その関数を呼び出すと、int を渡そうとしています。

コンパイラはメモリ アドレスを想定していますが、定数を渡そうとしています。

意味がありません。10 = 99 のようなことをしようとしています。15 = 77;?

numChange(10,15);
    //int a=10;
    //int b=15;

a = 10 = 99 および b = 15 = 77 とホップしているようです。

これが可能だった場合、(numChange(10,15); の呼び出し後) 10 は 99 を「指している」(そうではない) ため、実際に値 10 を持つ変数を作成できなかったことを意味します。

于 2012-11-17T01:46:40.650 に答える
2

思い出してください: ポインタは、メモリ内の位置を含む整数です。

これ:

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 にコピーして戻します。 .)

于 2012-11-17T05:27:41.697 に答える