c - 与 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;
}
谁能解释这两种方法之间的区别,应该使用哪一种来实现?
解决方案
第一个实现接受指向链表头部的指针参数。
第二个实现接受一个指向链表头部的指针。
你能说出为什么这可能很重要吗?
您想使用第二个,否则您将失去对正在创建的新节点的任何引用。
换句话说,第一个实现只是修改 的本地副本head
,最后一行head = new_node;
没有意义,实际上什么都不做,因为它正在处理本地值。第二种实现将修改外部的指针。
首先将像这样调用:
Node *head = NULL; // declared somewhere
pushathead( head, 1 );
第二个将被称为:
Node *head = NULL;
pushathead( &head, 1 );
在这里使用 address-of 运算符是一个很大的提示,head
它将被修改,这就是你想要的。
推荐阅读
- excel - 在列和单元格之间自动移动?
- sas - SAS EG System.AccessViolationException SAS.CIODSFileEvents_EventProvider.remove_FileClose(SAS.CIODSFileEvents_FileCloseEventHandler)
- r - 如何在 R 中仅集成多元函数中的变量?
- java - 已经失去了java包导入的机会
- scala - flatMap 忽略结果
- javascript - 在 console.log API 上未定义 NodeJS Axios 响应
- ruby-on-rails - 如何将查询参数传递给 Rails API 控制器?
- powershell - 通过 memberof 获取 ADUser 排序不为我工作
- javascript - 如何将逗号分隔的JS Multiple Object字符串转换为js对象或json?
- autodesk-forge - Forge/ Bim360:我们如何使用 BIM360 API 使用与问题类型映射的自定义属性创建问题?