怎么样*&被解析为C ++中的函数参数?

时间:2012-12-24 13:00:06

标签: c++ pointers parameters reference

我正在尝试理解将引用传递给指针的不同方法。一个实现涉及传递指针引用,另一个涉及传递指针。

我试图理解后者在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
...

但是,如果我想传递指针,而不是它的引用,那么在main中我会说:

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

并在changePointer中我将参数更改为:

void changePointer(int *& pp)

现在我不知道这是如何工作或如何阅读这个。这被解析为:

int * pp =& P?

5 个答案:

答案 0 :(得分: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

}

答案 1 :(得分:1)

void changePointer(int ** pp)

不通过引用传递指针 - 它按值传递指针指针。

void changePointer(int *& pp)

通过引用传递指针 - 更改函数内部的指针会将指针本身更改为外部。

答案 2 :(得分:1)

int * & pp

发音为“pp是指向int的引用”。这意味着指针参数通过引用传递,这意味着函数中应用于它的任何更改都将反映在传递的对象中,而不是其副本中。

答案 3 :(得分:0)

int*&是指针(&)与*的引用(int)。

答案 4 :(得分:0)

它被解析为(int *) (&) (pp)

int *就是这样,一个指向整数的指针。 &表示“对...的引用”,pp是变量的名称。

编译器在具有引用参数时所执行的操作是实际传递变量的地址[或类似于地址的东西 - 这是编译器中的实现细节]。最终,编译器在第一个代码片段中与&P完全相同 - 唯一的区别是你不能成为一个白痴并将NULL传递给函数,从而导致系统可能崩溃。