c - 修改链表中的头指针

标签 c pointers linked-list

我无法理解这段代码。我真正需要的只是修改头指针以指向第一个元素。那么为什么 *head 不工作呢?更改 *head 的值会更改此指针指向的位置,这应该有效,对吧?我已经阅读了按引用传递/按值传递,但发现很难理解。有人可以帮助澄清这一点吗? 感谢你的帮助。谢谢。

在 C/C++ 中,指针误用更容易出错。考虑用于在列表前面插入元素的 C/C++ 代码:

bool insertInFront( IntElement *head, int data ){
  IntElement *newElem = new IntElement;
  if( !newElem ) return false;

  newElem->data = data;
  head = newElem; // Incorrect!
  return true;
}

前面的代码是不正确的,因为它只更新了头指针的本地副本。正确的版本传入一个指向头指针的指针:

bool insertInFront( IntElement **head, int data ){
  IntElement *newElem = new IntElement;
  if( !newElem ) return false;

  newElen->data = data;
  *head = newElem; // Correctly updates head
  return true;
}

最佳答案

您需要帮助了解其中的区别,对吗?

想象一下第一种情况下函数的调用者:

IntElement *head;
int data;
...
insertInFront (head, data);

现在,在这种情况下,head 指向的地址被放在堆栈上并作为参数传递给 insertInFront。当 insertInFront 执行 head = newElement;只有参数(在堆栈上)被修改。

在第二种情况下,调用者将是:

IntElement *head;
int data;
...
insertInFront (&head, data);

在这种情况下,head 的地址被放在堆栈上并作为参数传递给 insertInFront。当您执行 *head = newElement 时,这个传入的地址将被取消引用以获取原始列表头的地址,并进行修改。

关于c - 修改链表中的头指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6810359/

相关文章:

c - 这种转换如何在 C 中工作?

c++ - 读取二维数组作为 C++ 函数中的参数?

c - 将 X 索引的内存复制到 C 中单个数组中的多个位置的最佳方法是什么?

c - 在c中将封装的动态大小的数据写入文本文件

c++ - 如何在正则表达式中匹配 '*'

c - 显示 RAND 字符的 ASCII 值

c++ - unordered_map 判断key是否在map中

java - 如何通过链接列表中的属性删除对象?

c - 实现 BFS 返回从顶点 s 到 t 的最小长度路径

c - 为什么我的函数无法调整指针的内容,除非我返回一个来分配它