我正在使用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)
之后,我在调用后的first->value
中看到main()
中的预期值他们(在这种情况下是10)。
这些方法中的任何一种都是正确的吗?都?如果两者兼而有之,两者之间的权衡是什么?
此外,是否可以使用引用指针传递first
(如someFunctB
中所示,对吧?)并且仍可直接处理它而无需复制? (当我使用引用指针并尝试访问函数中的modify->value
,*modify->value
或**modify->value
时,我收到错误request for member ‘value’ in something not a structure or union
。)
答案 0 :(得分:2)
是的,这两个都可以,但你可能想要第一个版本。您正在传递指向节点的指针,以便您的函数能够修改节点本身。第二个版本使您能够修改指针(即first
中的变量main()
),但如果您不需要这样做,则没有理由使用第二个选项。 / p>
关于在第二个函数中直接使用modify
的问题,正确的语法为(*modify)->value = 10
。