虽然这样做基于二叉搜索树的一些问题......我在函数调用了有点困惑:“struct node * temp”和“struct node *&temp”之间的区别是什么?
void find(node* root,node*& temp)
{
blah blah...
}
int main()
{
node* temp=NULL;
node* root=NULL;
find(root,temp);
}
是什么都传递参数之间的区别?
虽然这样做基于二叉搜索树的一些问题......我在函数调用了有点困惑:“struct node * temp”和“struct node *&temp”之间的区别是什么?
void find(node* root,node*& temp)
{
blah blah...
}
int main()
{
node* temp=NULL;
node* root=NULL;
find(root,temp);
}
是什么都传递参数之间的区别?
在
void find(node* root,node*& temp)
root
由值来传递。你对*root
所做的任何事情都会反映在来电者身上,但对root
的任何更改都不会。
temp
通过参考传递。您对*temp
所做的任何操作都会反映在来电者身上,而任何对temp
的更改也会反映在来电者身上。
所以,我可以使全球温度使用它们内查找功能,而不是传递给函数? – Himanshu
@Himanshu你冷,但全局变量在C++中不满。 – NathanOliver
我曾尝试过这个全局变量的概念在c ..但它没有工作.. – Himanshu
按值传递第一个指针函数参数(即node *root
)(即原函数对象的副本在函数中传递),第二个函数参数(即node*& temp
)通过引用传递(即,在函数中传递原始指针的别名)。
考虑下面的例子:
void find(node* root,node*& temp) {
root = z;
temp = z;
}
int main() {
node *root = x;
node *temp = y;
find(root, temp);
// at this point root still points to x
// temp changed and points to z
}
node *root
代表一个指向node
结构(通过值传递)的指针。如果你改变这个值,你在这里改变一个本地的可变值。
node *&temp
表示对指向node
结构的指针的引用。如果更改temp
的值,则可以修改通过引用传递的原始指针。
被宣布上的标识符的前缀&
使得它参考。因为引用不是const,所以参数表达式必须是左值(即必须指定一个对象)。该功能可以修改该对象!
如果该函数不修改对象,并且不尝试传递不是对象的内容(如空指针常量),则不会注意到任何差异。
声明的类型不变;无论哪种方式,该类型是node *
。参考不是类型;这是名称如何引用价值的一个方面。
举例来说,如果我们有:
int x = 0, y = 2;
有两个对象。如果我们声明y
作为参考,有int
类型的一个对象,它实际上有两个名字:
int x = 0, &y = x;
,参考值的初始化是x
对象本身,而不是x
的价值。
当我们声明一个函数参数作为参考时,它将成为一个“参考参数”。函数通过该参数接收值的方式从通过C继承的通常“传递值”语义改变。
也可以将引用绑定到const
类型。 Const参考参数是好奇的;它们可以接收文字对象的值:
void foo(const int &x); // can be called as foo(42); !
常量引用是有用的,因为当你传递一个const引用到一个类的对象,它类似于“按值传递”,但因为对象本身传递便宜(不复制施工发生)。
Const引用被引入到C++中以解决“复制构造函数的参数应该是什么?”的问题。副本构造函数不能是这样的:
some_class::some_class(some_class original_obj) { /*...*. }
,因为这创造了一个鸡和蛋的问题:传递对象的拷贝构造函数需要一个副本(由于值语义),这需要一个拷贝构造函数! Const参考发明救援:
some_class::some_class(some_class &original_obj) { /*...*. }
问题解决了;拷贝构造函数通过引用接收对象,但由于对象是准不可修改的,所以它是准安全的。 (准,因为在某些时候,mutable
关键字被发明用于在const
对象中打洞)。
这与'int'和'int&'之间的区别是相同的,以防您熟悉这些内容。 – molbdnilo