理解C ++中指针的操作

时间:2015-07-07 01:10:18

标签: c++ pointers data-structures

我一直在努力理解C ++中的指针是如何工作的,我有一些疑问,我希望有人会帮助我。

说我的结构如下:

struct node
{
    int val;
    node *n1;
    node **n2;
};

我也有如下功能:

void insertVal(node *&head, node *&last, int num)

我的问题:

  1. n2指向什么?使用'*''**'

  2. 之间有什么区别?
  3. 在函数*&是什么意思?我注意到在插入的链接列表实现中(在我看到的教程中)使用了'*&'而不仅仅是'*'为什么会出现这种情况?

  4. 如果这个问题很愚蠢,我很抱歉,但我很难理解这一点。感谢。

    编辑:我简化了结构只是为了理解**的含义。代码在这里:http://www.sanfoundry.com/cpp-program-implement-b-tree/。有人提到**指的是一个节点数组,我认为就是这种情况。

1 个答案:

答案 0 :(得分:4)

  
      
  1. n2指向什么?
  2.   

如果没有看到使用它的实际代码,就无法回答这个问题。但是,如果我不得不猜测,它可能是指向子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;
  
      
  1. 在函数中*&指向什么?
  2.   

它是指针变量(&)的引用(*)。如果你调整参数周围的空白,可能会更容易阅读:

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 ...