【发布时间】:2026-02-04 19:00:01
【问题描述】:
我正在使用 C 中的链表,并试图了解将节点传递给函数并修改该节点值的正确方法。
为了这些示例,假设我有一个单节点列表并且只关心修改第一个节点。
struct node {
int value;
struct node *next
};
在 main 我声明我的(单节点)列表:
int main(){
struct node *first;
first = malloc(sizeof(struct node));
first->value = 5;
first->next = NULL;
//someFunctA(first);
//someFunctB(&first);
};
要在函数中修改first->value,我应该使用:
void someFunctA(struct node *modify){
modify->value = 10;}
或:
void someFunctB(struct node **modify){
struct node *temp = *modify;
temp->value = 10;}
(或者两者都不是?)
似乎都可以工作 - 在调用 someFunctA(home) 或 someFunctB(&home) 之后,我在调用它们后在 main() 中看到了 first->value 中的预期值(在这种情况下为 10)。
这些方法是否正确?两个都?如果两者都有,两者之间的取舍是什么?
另外,是否可以使用引用指针传递first(如someFunctB,对吗?)并且仍然可以直接处理它而不制作副本? (当我使用引用指针传递并尝试访问函数中的modify->value、*modify->value 或**modify->value 时,我收到错误request for member ‘value’ in something not a structure or union。)
【问题讨论】:
-
如果函数需要修改数据但不需要在列表本身上工作,它可能不应该使用列表节点......它可能应该只使用指向数据的指针,或返回要在函数外部分配的新值。那么
void someFuncA(int *val) { *val = 10; }被称为someFuncA(&first->value);怎么样?
标签: c pointers linked-list parameter-passing