我一直在努力理解C ++中的指针是如何工作的,我有一些疑问,我希望有人会帮助我。
说我的结构如下:
struct node
{
int val;
node *n1;
node **n2;
};
我也有如下功能:
void insertVal(node *&head, node *&last, int num)
我的问题:
n2
指向什么?使用'*'
和'**'
?
在函数*&
是什么意思?我注意到在插入的链接列表实现中(在我看到的教程中)使用了'*&'
而不仅仅是'*'
为什么会出现这种情况?
如果这个问题很愚蠢,我很抱歉,但我很难理解这一点。感谢。
编辑:我简化了结构只是为了理解**的含义。代码在这里:http://www.sanfoundry.com/cpp-program-implement-b-tree/。有人提到**指的是一个节点数组,我认为就是这种情况。答案 0 :(得分:4)
- n2指向什么?
醇>
如果没有看到使用它的实际代码,就无法回答这个问题。但是,如果我不得不猜测,它可能是指向子node
指针的动态数组的指针,例如:
node *n = new node;
n->val = ...;
n->n1 = ...;
n->n2 = new node*[5];
n->n2[0] = new node;
n->n2[1] = new node;
n->n2[2] = new node;
n->n2[3] = new node;
n->n2[4] = new node;
使用'*'和'**'有什么区别?
指向node
的指针与指向node
指针的指针,例如:
node n;
node *pn = &n;
node **ppn = &pn;
- 在函数中
醇>*&
指向什么?
它是指针变量(&
)的引用(*
)。如果你调整参数周围的空白,可能会更容易阅读:
void insertVal(node* &head, node* &last, int num)
我注意到在插入的链表实现中(在我看过的教程中)
'*&'
被用来代替'*'
为什么会这样?
使用引用,以便函数可以修改被引用的调用者的变量,例如:
void insertVal(node* &head, node* &last, int num)
{
...
// head and last are passed by reference, so any
// changes made here are reflected in the caller...
head = ...;
last = ...;
...
}
node *head = ...;
node *last = ...;
...
insertVal(head, last, ...);
// head and last contain new values here ...
否则,如果没有&
(或第二个*
),原始指针只是作为副本传递值,并且对该副本的任何更改都不会反映在调用者的变量中:< / p>
void insertVal(node* head, node* last, int num)
{
...
// head and last are passed by value, so any changes
// made here are not reflected in the caller...
head = ...;
last = ...;
...
}
node *head = ...;
node *last = ...;
...
insertVal(head, last, ...);
// head and last still have their original values here ...