指针的价值没有变化

Mik*_*rew -3 c++ pointers linked-list data-structures

class node{
    public:    node* next;
               int data;
};
void insert_node(node* head, int val){
    node* n = new node();
    n->next = NULL;
    n->data = val;
    cout << n->data << endl;
    if (head == NULL){   //point .1.
        head = n;        //point .2.
        cout<<"checkpoint 1 reached"<<endl;
    }
    else{
        node* p = head;
        while (p->next !=NULL)
            p= p->next ;
        p->next = n;
        head->next = n;
    }
    return ;
}
int main(){
    node* head = NULL;
    insert_node(head, 3);
    insert_node(head, 4);
    insert_node(head, 5);
    insert_node(head, 6);
    insert_node(head, 7);
    insert_node(head, 8);
    insert_node(head, 9);
    insert_node(head, 0);
}
`
Run Code Online (Sandbox Code Playgroud)

在上面提到的基本链表代码中,每次调用insert_node函数时,它都会到达点.1.这意味着总是有头/指向NULL,这实际上意味着头没有被更新 - 但我在点.2更新它..提前致谢.:)

vso*_*tco 5

指针是一个变量,就像任何其他变量一样,因此它可以通过值,引用或指针传递.你按值传递它,

void insert_node(node* head, int val)
Run Code Online (Sandbox Code Playgroud)

如果要更改它,请通过引用传递它

void insert_node(node* & head, int val)
Run Code Online (Sandbox Code Playgroud)

或者通过指针指向它

void insert_node(node** head, int val)
Run Code Online (Sandbox Code Playgroud)

通过引用传递可能最容易,因为它不涉及任何代码更改.您还可以使用a typedef node* NODEPTR;作为类型别名,然后事情变得更加透明,

void insert_node(NODEPTR head, int val) // a bit more clear that head is passed by value
Run Code Online (Sandbox Code Playgroud)