将"指向结构的指针"传递给函数是否在C中创建它的本地副本?

Reg*_*ser 4 c struct pointers

我有这样的结构

struct node
{
    int data;
    struct node* next;
};
Run Code Online (Sandbox Code Playgroud)

我用它来创建单链表.

我创建了其他功能

int push(struct node* head,int element);
Run Code Online (Sandbox Code Playgroud)

它将数据推送到使用节点结构创建的堆栈.

该函数然后尝试struct node* head使用代码更新传递给它(它还做其他事情)

head=(struct node*)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)

这样的电话是这样的

struct node* stack;
push(stack,number);
Run Code Online (Sandbox Code Playgroud)

看起来这个代码创建了传递给它的指针的副本.所以我不得不将功能更改为

int push(struct node** head,int element)
Run Code Online (Sandbox Code Playgroud)

*head=(struct node*)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)

这样的电话是这样的

struct node* stack;
push(&stack,number);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,早期的功能是做什么的?struct node**如果我想更新指针的原始值或者我的方法错了,是否有必要传递给函数?

对不起,我无法提供完整的代码,因为它是一项任务.

Kar*_*and 6

C总是按值传递.要更改传递给函数的变量,而不是传递变量本身,请传递引用(其地址).

假设您使用旧签名调用函数

int push(struct node* head,int element);

struct node *actual_head = NULL;
push(actual_head, 3);
Run Code Online (Sandbox Code Playgroud)

现在在调用push之前,您的变量actual_head将具有值NULL.

在push函数内部,一个新变量head将被推送到堆栈.它将具有与传递给它的值相同的值,即NULL.

然后,当您调用时head = malloc(...),您的变量head将获得一个新值而不是actual_head您想要的值.

要缓解上述情况,您必须将函数的签名更改为

int push(struct node** head,int element);

struct node *actual_head = NULL
push(&actual_head, 3);
Run Code Online (Sandbox Code Playgroud)

现在,如果你仔细注意,值actual_headNULL,但是这个指针也存储在某处,某处是它的地址&actual_head.我们把这个地址作为1234.

现在在push函数内部,你的变量head可以保存指针的地址(注意两个*),其值为1234

现在,当您这样做时*head = malloc(...),您实际上正在更改位于1234位置的对象的值,这是您的actual_head对象.


Aas*_*set 5

C总是按值传递参数(即通过复制它)。这甚至适用于指针,但在这种情况下,复制的是指针本身。大多数时候您使用指针,这很好,因为您对操作指针指向的数据感兴趣。但是,在您的情况下,您想要修改指针本身,因此您确实必须使用指向指针的指针。