简体   繁体   中英

pointer operation in c & c++

struct node {

    int data;
    struct node* next;

}

void push (struct node **head, int data) {

    struct node* newNode = malloc (sizeof (struct node));
    newNode->data = data;
    newNode->next = *head;
    *head = newNode;     
} 

//I understand c version well.

C++ version

void Stack::push( void *data ) {

        struct node *newNode = new node;
        newNode->data = data;
        newNode->next = head;
        head = newNode;

}

In c++ head is a private or protected member of stack class and is declared as node *head.

Question: why head can preserve its value after push() call in c++.
In c, we need to declare it as ** since we want to change the value of head pointer after the push() function call. In c++ code, won't changes to head be lost after the call?

The problem here is the C code you're comparing to C++ is not really analogous. A better example would be

typedef struct Node { 
  int data;
  struct Node* pNext;
} Node;

typedef struct Stack {
  Node* pHead;
} Stack;

void push(Stack* this, int data) {
  Node* newNode = malloc (sizeof (Node));
  newNode->data = data;
  newNode->next = this->head;
  this->head = newNode;  
}

In this version we've successfully implemented push without having to take a ** for head. We have in a way because it's double indirected via the Stack* . But this is very similar to how C++ works. It's possible to view C++ as passing this as a hidden argument to the function.

In this case, since Stack::push is non-static, head is a shorthand for this->head . So the head = newNode is the same as:

this->head = newNode;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM