0

ポインタなどを使用せずに戻った後、引数が別の(既存の)オブジェクトを参照するようにする関数を定義することは可能ですか?繰り返しますが、これは、コピーコンストラクターや代入演算子などを使用して既存のオブジェクトを変更することはできません。関数が返されたときに、外部オブジェクトは別のメモリブロックを参照します。

例えば:

int x;
void change(int& blah) {
    blah = x; // I don't want to change blah's value to x's value, I want to make blah refer to x outside the function
}

void main() {
    int something = 0;
    change(something);
    assert(&x == &something);
}

使用するメソッドに関係なく、関数は次のように呼び出す必要があります

change(x);

関数を呼び出す前に、引数に特別な演算子や関数を適用しません。これが可能かどうかはわかりませんが、可能であれば非常にクールなことが可能になります。そうでない場合は、その理由も知りたいと思います。

4

3 に答える 3

5

いいえ、somethingxは異なるオブジェクトであるためです。それらは異なるオブジェクトを参照しません。それらは異なるオブジェクトを指していません。それら異なるオブジェクトです。

何かが指す場所を変更するには、その何かがポインタである必要があります。ポインタがある場合は、次のように実行できます。

int x;

void change(int*& p)
{
    p = &x;
}

int main()
{
    int something = 0;
    int* pointer = &something; // pointer points to 'something'
    change(pointer);           // now pointer points to 'x'
    assert(&x == pointer);
}
于 2011-08-08T03:49:58.137 に答える
1

いいえ、絶対に不可能です。のような通常の変数と配列int xのような参照変数はどちらint &y(...)も再封可能ではありません。つまり、常に同じメモリチャンクを使用/ポイントします。

必要な機能を取得するには、実際にはポインターまたはポインターの抽象化を使用する必要があります。それ以外の場合は不可能です。

説明の試みとして、ここに行きます(完全に正しくはなく、大幅に単純化されていますが、アイデアを得るのに十分です):

のような変数を宣言すると、int x実際にはコンパイラxがメモリの特定の領域に関連付けるように要求されます。したがって、たとえば、でx始まる4バイトが関連付けられているとし0x439FC2ます。xコンパイラは常に参照する必要があることを知っているので、これらのメモリセルを検索し、レジスタにロードしたり、スタックにプッシュしたりすることで、実際に0x439FC2使用を置き換えることができます。xとにかく、最終的な結果は、変数名xがほとんど数字に置き換えられること0x439FC2です。したがって、移動できない理由xは、そのメモリアドレスがメモリ内の別の場所を参照するようにすることができないためです。

繰り返しになりますが、その説明は単純化されており、完全に正しいわけではありませんが、自動的に割り当てられた変数について推論する「直感的な」方法です。

于 2011-08-08T03:54:31.037 に答える
0

ポインタへの参照を使用したい:

void change(int &* blah, int * x){

  blah = x;
}

int * num1;
int num2 = 2;

change( num1, &num2 ); //num1 now points to num2
于 2011-08-08T03:52:39.880 に答える