1

ポインタへの参照を渡すさまざまな方法を理解しようとしています。1つの実装にはポインター参照の受け渡しが含まれ、もう1つの実装にはポインターの受け渡しが含まれます。

*&後者のC++で""がどのように解析されているかを理解しようとしています。

ポインタPが指すものを変更したいとします。ポインターまたはポインターへの参照のいずれかを渡すことができます。ポインタへの参照を渡すと、実装は次のようになります

void changePointer(int ** pp){

    //stuff that changes P from main();

}

//...

int main(){

    int a = 7;
    int * P = &a;
    changePointer(&P);
    return 0;

}

上記では、changePointerのパラメーターは次のように解析されています。

void changePointer(int ** pp){
//int ** pp = &P; //where P is the integer pointer being passed by main
...

ただし、参照ではなくポインタを渡したい場合は、主に次のように言います。

//...
changePointer(P);
//...

changePointerでは、パラメーターを次のように変更します。

void changePointer(int *& pp)

今、私はこれがどのように機能しているか、またはこれをどのように読むかについての手がかりがありません。これは次のように解析されていますか?

int * pp =&P?

4

5 に答える 5

3

これは、他のオブジェクトと同じように、参照によってポインタを渡します。構文を右から左に読んでください:ポインタへの参照。単純な整数の場合int *&pp = Pと同じように行うのと同じです。int &j = i

void f(int *& ptr) {
    // f(pointer) is the same as
       int *& ptr = pointer
}

引数を作成する方法は、解析される方法と同じです。渡した引数と等しい変数をパラメーターに作成しているだけです。また、参照は関数の内部でも外部と同じように機能します。例えば:

int main() {

    int a = 7,
        b = 5,
       *P = &a; // *P == 7

    int *&pp = P;

    pp = b; // *P == 5

}
于 2012-12-24T13:03:42.330 に答える
1

これ

void changePointer(int ** pp)

参照によってポインタを渡しません-値によってポインタにポインタを渡します。

これ

void changePointer(int *& pp)

参照によってポインターを渡します-関数内でポインターを変更すると、ポインター自体が外部で変更されます。

于 2012-12-24T13:03:03.060 に答える
1
int * & pp

「ppはintへのポインタへの参照」と発音されます。これは、ポインタ引数が参照によって渡されることを意味します。つまり、関数でポインタ引数に適用された変更は、渡されたオブジェクトのコピーではなく、渡されたオブジェクトに反映されます。

于 2012-12-24T13:03:22.593 に答える
0

int*&&へのポインタ(*)への参照( )intです。

于 2012-12-24T13:03:02.020 に答える
0

として解析され(int *) (&) (pp)ます。

これint *はまさにそれが何であるか、整数へのポインタです。は&「への参照」を意味しpp、変数の名前です。

参照パラメーターがある場合にコンパイラーが行うことは、変数のアドレス[またはアドレスに類似したもの-これはコンパイラーの実装の詳細です]を実際に渡すことです。したがって、最終的に、コンパイラは最初のコードスニペットとまったく同じことを&P行います。唯一の違いは、馬鹿になって関数にを渡すことができないためNULL、システムがクラッシュする可能性があることです。

于 2012-12-24T13:04:55.543 に答える