gpt4 book ai didi

c - 通过值和引用将 c 中结构类型的指针传递给函数

转载 作者:行者123 更新时间:2023-11-30 18:22:22 27 4
gpt4 key购买 nike

好吧,我知道这样一个事实:将指向结构的指针作为参数传递给函数会使该参数的行为就像按值传递一样,只是对于结构的特殊情况而言。因此,如果我要对链接列表中的 head ptr 进行任何修改,则在被调用函数中所做的更改不会反射(reflect)在调用 fnt 中,但我的问题是是否对被调用函数中任何后续节点的指针进行了更改反射(reflect)在调用函数中。例如,如果我要说从链接列表的开头删除第五个节点,该链接列表的头指针是通过使用单指针而不是双指针传递的,那么从函数返回的列表是否包含删除的元素还是不包含它?

好的另一个例子:在下面的代码中递归删除链接列表中的替代元素,会不会失败,因为参数是 *head 而不是 **head?

void deleteAlt(struct node *head)
{
if (head == NULL)
return;

struct node *node = head->next;

if (node == NULL)
return;

/* Change the next link of head */
head->next = node->next;

/* free memory allocated for node */
free(node);

/* Recursively call for the new next of head */
deleteAlt(head->next);
}

最佳答案

I know for a fact that passing pointer to a structure as argument to a function makes the argument behave as though it was passed by value, just for the special case of structures.

这根本不是真的。如果按值传递指针本身(因为每个参数都在 C 中),但不会复制指针引用的变量。在函数中更改它会在调用者中更改它,因为它具有相同的结构。

#include <stdio.h>
#include <stdlib.h>

struct S {
int i;
};

void f(struct S* s) {
s->i = 456;
}

int main() {
struct S* s = malloc(sizeof(struct S));
s->i = 123;
printf("%d\n", s->i);
f(s);
printf("%d\n", s->i);
free(s);
return 0;
}

$ gcc -o a a.c && a
123
456
<小时/>

ok another example: in the following code to recursively delete alternate elements in a link list, wouldnt it fail, because the parameter is *head instead of **head?

没有。由于 deleteAlt 永远不会修改 head,因此无需更新其调用者的 head,因此无需将指针传递给调用者的

关于c - 通过值和引用将 c 中结构类型的指针传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23915016/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com