在我的C ++类数据结构中,我们正在研究二叉树。一些代码包含&和和*同时使用(彼此相邻),这非常令人困惑。
void balance( AvlNode * & t )
是使用它的函数定义的一个示例。这里用*和&?
会发生什么编辑:对此的回答告诉我,我对指针和引用一无所知,但是源代码都说不同的东西,like here例如调用* dereference运算符。我在哪里可以在一个地方找到所有这些信息? (最好不要在stackoverflow上)
答案 0 :(得分:6)
从右到左阅读 1 ,将&
读作“对[a | an]的引用”,将*
作为“指向[a | an]的指针“,所以你得到:”t是对指向AvlNode的指针的引用“。
1.对于更复杂的情况,它并不总是完全正确的左 - 它是从声明向外的名称到声明的类型。如果您有多个嵌套括号,则从名称前进到右括号,然后左键到匹配的左括号,然后从最后离开的位置到下一个右括号,依此类推,直到到达最外面的括号水平。 功能
答案 1 :(得分:1)
它是对AvlNode *
例如考虑(为了说明目的,它有一个内存泄漏并不重要)
#include <iostream>
typedef int AvlNode; // It is not important what is the type AvlNode
void balance( AvlNode * & t )
{
t = new AvlNode( 10 );
}
void another_balance( AvlNode * t )
{
t = new AvlNode( 20 );
}
int main()
{
AvlNode *p = NULL;
std::cout << ( void * )p << std::endl;
another_balance( p );
std::cout << ( void * )p << std::endl;
balance( p );
std::cout << ( void * )p << std::endl;
std::cout << *p << std::endl;
delete p;
}
考虑函数调用的结果。
答案 2 :(得分:1)
'&amp;'当字符在函数声明或定义中使用时,它在C ++中具有特殊含义。它的意思是“通过引用传递值”。当你“通过引用传递”时,C ++会在你将变量传递给函数时自动创建变量的引用,然后它会自动在函数内取消引用它。
因此,此函数通过引用传递类型t
的一个变量AvlNode *
。因此,您有AvlNode * & t
例如:
void balance( AvlNode * & t )
{...}
main()
{
AvlNode * a = new AvlNode();
balance(a);
}
与:
相同void balance( AvlNode ** t_ptr )
{
AvlNode * t = *t_ptr;
...
}
main()
{
AvlNode * a = new AvlNode();
balance(&a);
}