операция указателя в c & c ++ - PullRequest
3 голосов
/ 26 мая 2011
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;

}

В c ++ head является частным или защищенным членом класса стека и объявляется как узел * head.

Вопрос: почему head может сохранить свое значение после вызова push () в c ++.
В c нам нужно объявить его как **, так как мы хотим изменить значение указателя головы после вызова функции push ().В коде c ++, изменения в голове не будут потеряны после вызова?

Ответы [ 2 ]

7 голосов
/ 26 мая 2011

Проблема в том, что код C, который вы сравниваете с C ++, на самом деле не аналогичен. Лучшим примером будет

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;  
}

В этой версии мы успешно реализовали push без необходимости брать ** за голову. Мы имеем в виду, потому что это двойное обращение через Stack*. Но это очень похоже на то, как работает C ++. Можно рассматривать C ++ как передачу this как скрытый аргумент функции.

3 голосов
/ 26 мая 2011

В этом случае, поскольку Stack::push не является статичным, head является сокращением для this->head.Таким образом, head = newNode - это то же самое, что и

this->head = newNode;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...