首页 > 解决方案 > 与 C 中的指针相关

问题描述

void pushathead(struct Node* head, int data){
  struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
  new_node->data = data;
  new_node->next = head;
  head = new_node;
}
void pushathead(struct Node** head, int data){
  struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
  new_node->data = data;
  new_node->next = (*head);
  (*head) = new_node;
}

谁能解释这两种方法之间的区别,应该使用哪一种来实现?

标签: cpointers

解决方案


第一个实现接受指向链表头部的指针参数。

第二个实现接受一个指向链表头部的指针。

你能说出为什么这可能很重要吗?

您想使用第二个,否则您将失去对正在创建的新节点的任何引用。

换句话说,第一个实现只是修改 的本地副本head,最后一行head = new_node;没有意义,实际上什么都不做,因为它正在处理本地值。第二种实现将修改外部的指针。

首先将像这样调用:

Node *head = NULL; // declared somewhere
pushathead( head, 1 );

第二个将被称为:

Node *head = NULL;
pushathead( &head, 1 );

在这里使用 address-of 运算符是一个很大的提示,head它将被修改,这就是你想要的。


推荐阅读