C和C++中的指针操作

3
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是stack类的私有或受保护成员,并声明为node *head。

问题:为什么在C++中push()调用后head可以保留其值。
在C中,我们需要将其声明为**,因为我们想要在push()函数调用后更改head指针的值。在C++代码中,对head的更改不会在调用后丢失吗?


据推测,head是该类的成员变量。你正在学习哪本不涵盖这个内容的C++书籍? - user2100815
我很多年前学过C++,但之后从未使用过。当时我用的是蓝色封面的书。我主要使用C语言,但也很少用。顺便说一下,这是我在这里的第一篇帖子,我非常感谢社区的回应! - user770284
2个回答

7
这里的问题在于你所比较的 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作为函数的隐藏参数传递。


为了更清晰地表达,您可以将“pStack”重命名为“this”(因为后者不是C中的保留字)。 - C. K. Young

3
在这种情况下,由于Stack::push是非静态的,headthis->head的简写。因此,head = newNode与以下语句相同:
this->head = newNode;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接