我正在尝试理解将引用传递给指针的不同方法。一个实现涉及传递指针引用,另一个涉及传递指针。
我试图理解后者在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?
答案 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
传递给函数,从而导致系统可能崩溃。